python多线程实现S3文件分段上传下载

对于大对象的存取,s3提供了分段上传/下载的接口,基于此,可以进一步实现多线程并行传输或者断点续传等功能。

本实现使用了亚马逊的boto库

https://pypi.python.org/pypi/boto

以及filechunkio库

https://pypi.python.org/pypi/filechunkio/

from boto.s3.connection import S3Connection,OrdinaryCallingFormat,SubdomainCallingFormat

import ssl

import boto.s3.key

import os

import json

import random

import fire

import math

from filechunkio import FileChunkIO

class S3(object):

    def __init__(self,host,access_key_id,secret_access_key,port=443,is_secure=True):

        if is_secure:

            ssl._create_default_https_context =ssl._create_unverified_context

        self._secure=is_secure

        self.host=host

        self.access_key_id=access_key_id

        self.secret_access_key=secret_access_key

        self.port=port

        self._connection=False

        self._client=None

    # def __del__(self):

    #    self._client.closed()

    def connect(self,aws=False):

        try:

            if aws:

                calling_format=SubdomainCallingFormat()

            else:

                calling_format=OrdinaryCallingFormat()

            conn = S3Connection(

                host=self.host,

                aws_access_key_id=self.access_key_id,

                aws_secret_access_key=self.secret_access_key,

                port=self.port,

                debug=1,

                is_secure=self._secure,

                calling_format=calling_format

            )

            self._connection=True

            self._client=conn

        except Exception as e:

            self._connection=False

            print(e)

    def create_bucket(self,bucket):

        try:

            bucket=self._client.create_bucket(bucket)

        except Exception as e:

            print(e)

            print(bucket)

    def delete_bucket(self,bucket):

        try:

            bucket=self._client.get_bucket(bucket)

            bucket.delete()

        except Exception as e:

            print(e)

            print(bucket)

    def set_acl(self):

        pass

    def delete_bucket_force(self,bucket):

        try:

            bucket=self._client.get_bucket(bucket)

            for obj in bucket.list():

                obj.delete()

            bucket.delete()

        except Exception as e:

            print(e)

            print(bucket)


    def upload_file(self,bucket,file_path,path=''):

        try:

            bucket=self._client.get_bucket(bucket)

            key=bucket.new_key(path+os.path.basename(file_path))

            key.set_contents_from_filename(file_path)

            return True

        except Exception as e:

            print(e)

            return False

    def chunk_upload_file(self,bucket,file_path):

        try:

            source_path = file_path

            source_size = os.stat(file_path).st_size

            chunk_size = 52428800

            chunk_count = int(math.ceil(source_size / float(chunk_size)))

            bucket=self._client.get_bucket(bucket)

            mp=bucket.initiate_multipart_upload(os.path.basename(file_path))

            for i in range(chunk_count):

                offset = chunk_size * i

                bytes_ = min(chunk_size, source_size - offset)

                with FileChunkIO(source_path, 'r', offset=offset,bytes=bytes_) as fp:

                    mp.upload_part_from_file(fp, part_num=i + 1)


            mp.complete_upload()

            return True

        except Exception as e:

            print(e)

            return False


if __name__ == "__main__":

    s3_obj=S3("host","id","key",443,True)

    s3_obj.connect()

    fire.Fire({

        "upload":s3_obj.upload_file,

        "mp_upload":s3_obj.chunk_upload_file,

        "create_bucket":s3_obj.create_bucket

    })

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 对于大对象的存取,s3提供了分段上传/下载的接口,基于此,可以进一步实现多线程并行传输或者断点续传等功能。 本实现...
    bloody阅读 13,127评论 2 4
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,734评论 0 38
  • 网络编程 一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运...
    go以恒阅读 6,399评论 0 6
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 11,120评论 0 10
  • 社交网站上,小兔的头像是她成人礼时的照片。身着翠绿华美的和服,梳着别致的簪花盘发,笑容比花还要甜美。 她的主页就像...
    f19677425d33阅读 3,077评论 3 55