python多線程實現(xiàn)S3文件分段上傳下載

對于大對象的存取或油,s3提供了分段上傳/下載的接口郭脂,基于此零渐,可以進一步實現(xiàn)多線程并行傳輸或者斷點續(xù)傳等功能娄涩。

本實現(xiàn)使用了亞馬遜的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

? ? })

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绢要,隨后出現(xiàn)的幾起案子吏恭,更是在濱河造成了極大的恐慌,老刑警劉巖重罪,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件樱哼,死亡現(xiàn)場離奇詭異哀九,居然都是意外死亡,警方通過查閱死者的電腦和手機搅幅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門阅束,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茄唐,你說我怎么就攤上這事息裸。” “怎么了沪编?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵呼盆,是天一觀的道長。 經(jīng)常有香客問我蚁廓,道長访圃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任相嵌,我火速辦了婚禮腿时,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘平绩。我一直安慰自己圈匆,他們只是感情好漠另,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布捏雌。 她就那樣靜靜地躺著,像睡著了一般笆搓。 火紅的嫁衣襯著肌膚如雪性湿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天满败,我揣著相機與錄音肤频,去河邊找鬼。 笑死算墨,一個胖子當著我的面吹牛宵荒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播净嘀,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼报咳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挖藏?” 一聲冷哼從身側(cè)響起暑刃,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膜眠,沒想到半個月后岩臣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溜嗜,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年架谎,在試婚紗的時候發(fā)現(xiàn)自己被綠了炸宵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡谷扣,死狀恐怖焙压,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抑钟,我是刑警寧澤涯曲,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站在塔,受9級特大地震影響幻件,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛔溃,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一绰沥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贺待,春花似錦徽曲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哪工,卻和暖如春奥此,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雁比。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工稚虎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人偎捎。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓蠢终,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茴她。 傳聞我的和親對象是個殘疾皇子寻拂,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 對于大對象的存取,s3提供了分段上傳/下載的接口败京,基于此兜喻,可以進一步實現(xiàn)多線程并行傳輸或者斷點續(xù)傳等功能。 本實現(xiàn)...
    bloody閱讀 9,265評論 2 4
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,743評論 0 38
  • 網(wǎng)絡編程 一.楔子 你現(xiàn)在已經(jīng)學會了寫python代碼帕识,假如你寫了兩個python文件a.py和b.py,分別去運...
    go以恒閱讀 1,992評論 0 6
  • 一遂铡、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,723評論 0 10
  • 社交網(wǎng)站上肮疗,小兔的頭像是她成人禮時的照片。身著翠綠華美的和服扒接,梳著別致的簪花盤發(fā)伪货,笑容比花還要甜美。 她的主頁就像...
    f19677425d33閱讀 381評論 3 55