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 断点续传(多线程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ant vue 语言_Ant Desig
- 下一篇: jwt的token自动续约_JWT(JS