日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oss多线程 上传_oss-android/ios-sdk 断点续传(多线程)

發布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oss多线程 上传_oss-android/ios-sdk 断点续传(多线程) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

oss-android/ios-sdk 斷點續傳

前言

移動端現狀

隨著移動端設備的硬件水平的不斷提高,如今的cpu,內存等方面都大大的超過了一般的pc電腦,因此在現今的程序中,合理的使用多線程去完成一些事情是非常有必要的。

多線程上傳的好處

進一步占滿網絡資源。

進一步占滿I/O資源。

實現原理

策略

oss有分片上傳的功能,斷點續傳就是基于分片上傳的幾個api接口進行的封裝,主要由InitiateMultipartUpload,UploadPart,CompleteMultipartUpload,AbortMultipartUpload,ListParts這幾個組成。

流程

細節

斷點續傳是一個大任務,又3部分來完成,分別是獲取uploadId,分片上傳,完成上傳,這一整個連續的步驟統一在一個線程中進行。

獲取uploadId這塊需要先對本地緩存文件進行獲取,如未拿到,就會直接重新生成新的uploadId直接去進行分片上傳,否則會對記錄的id進行之前上傳了多少片進行還原,繼續原來的位置繼續上傳。

分片上傳部分,采用多線程并發上傳機制,目前線程開啟數量最多5條,根據cpu的核數進行判斷,如果核數<5

會采用核數進行配置, 分片的個數最多5000。

完成上傳,對上傳的part進行排序,需要按照自然順序1~n 的順序進行上傳。

文件校驗,通過文件的md5等其他信息進行校驗,分片上傳中每一片也會跟服務器做md5校驗。

進度回調機制,目前進度回調算是最基礎版,目前回調原理是根據每一個分片來回調的,即當分片上傳成功回調一次。

使用方式

在本地持久保存斷點記錄的調用方式:

android:

", "", "", recordDirectory);\n // 設置上傳過程回調\nrequest.setProgressCallback(new OSSProgressCallback() {\n @Override\n public void onProgress(ResumableUploadRequest request\n , long currentSize, long totalSize) {\n Log.d("resumableUpload", "currentSize: " + currentSize + " totalSize: " + totalSize);\n }\n});\nOSSAsyncTask resumableTask = oss.asyncResumableUpload(request\n , new OSSCompletedCallback() {\n @Override\n public void onSuccess(ResumableUploadRequest request, ResumableUploadResult result) {\n Log.d("resumableUpload", "success!");\n }\n \n @Override\n public void onFailure(ResumableUploadRequest request, ClientException clientExcepion\n , ServiceException serviceException) {\n // 異常處理\n }\n});","classes":null}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet" class="cke_widget_element">String recordDirectory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/oss_record/";

File recordDir = new File(recordDirectory);

// 要保證目錄存在,如果不存在則主動創建

if (!recordDir.exists()) {

recordDir.mkdirs();

}

// 創建斷點上傳請求,參數中給出斷點記錄文件的保存位置,需是一個文件夾的絕對路徑

ResumableUploadRequest request

= new ResumableUploadRequest("", "", "", recordDirectory);

// 設置上傳過程回調

request.setProgressCallback(new OSSProgressCallback() {

@Override

public void onProgress(ResumableUploadRequest request

, long currentSize, long totalSize) {

Log.d("resumableUpload", "currentSize: " + currentSize + " totalSize: " + totalSize);

}

});

OSSAsyncTask resumableTask = oss.asyncResumableUpload(request

, new OSSCompletedCallback() {

@Override

public void onSuccess(ResumableUploadRequest request, ResumableUploadResult result) {

Log.d("resumableUpload", "success!");

}

@Override

public void onFailure(ResumableUploadRequest request, ClientException clientExcepion

, ServiceException serviceException) {

// 異常處理

}

});

ios:

;\nresumableUpload.objectKey = ;\nresumableUpload.partSize = 1024 * 1024;\nresumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {\n NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);\n};\n \nresumableUpload.uploadingFileURL = [NSURL fileURLWithPath:];\nNSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];\nresumableUpload.recordDirectoryPath = cachesDir;//記錄斷點的文件路徑\nOSSTask * resumeTask = [client resumableUpload:resumableUpload];\n[resumeTask continueWithBlock:^id(OSSTask *task) {\n if (task.error) {\n NSLog(@"error: %@", task.error);\n if ([task.error.domain isEqualToString:OSSClientErrorDomain]\n && task.error.code == OSSClientErrorCodeCannotResumeUpload) {\n // 該任務無法續傳,需要獲取新的uploadId重新上傳\n }\n } else {\n NSLog(@"Upload file success");\n }\n return nil;\n}];","classes":null}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet" class="cke_widget_element">// 獲得UploadId進行上傳,如果任務失敗并且可以續傳,利用同一個UploadId可以上傳同一文件到同一個OSS上的存儲對象

OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];

resumableUpload.bucketName = ;

resumableUpload.objectKey = ;

resumableUpload.partSize = 1024 * 1024;

resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {

NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);

};

resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:];

NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

resumableUpload.recordDirectoryPath = cachesDir;//記錄斷點的文件路徑

OSSTask * resumeTask = [client resumableUpload:resumableUpload];

[resumeTask continueWithBlock:^id(OSSTask *task) {

if (task.error) {

NSLog(@"error: %@", task.error);

if ([task.error.domain isEqualToString:OSSClientErrorDomain]

&& task.error.code == OSSClientErrorCodeCannotResumeUpload) {

// 該任務無法續傳,需要獲取新的uploadId重新上傳

}

} else {

NSLog(@"Upload file success");

}

return nil;

}];

性能統計

數據分析

android/ios 端的分片上傳改為并發后的測試與之前對比,上傳分片的網絡請求速度?多線程 和

單線程是一樣的使用時間,這個主要是取決于帶寬速度, 多線程相較于單線程主要是提高了讀取文件的io時間。數據如下:

分享:

喜歡

0

贈金筆

加載中,請稍候......

評論加載中,請稍候...

發評論

登錄名: 密碼: 找回密碼 注冊記住登錄狀態

昵???稱:

評論并轉載此博文

發評論

以上網友發言只代表其個人觀點,不代表新浪網的觀點或立場。

總結

以上是生活随笔為你收集整理的oss多线程 上传_oss-android/ios-sdk 断点续传(多线程)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。