分片上傳接口
更新時間 2025-10-11 11:19:14
最近更新時間: 2025-10-11 11:19:14
分享文章
融合接口
SDK提供封裝好的融合接口,方便用戶實現分片上傳的功能。
接口定義
- (AWSTask<AWSS3TransferUtilityUploadTask *> *)uploadData:(NSData *)data
key:(NSString *)key
contentType:(NSString *)contentType
expression:(nullable AWSS3TransferUtilityUploadExpression *)expression
completionHandler:(nullable AWSS3TransferUtilityUploadCompletionHandlerBlock)completionHandler;
?
- (AWSTask<AWSS3TransferUtilityUploadTask *> *)uploadData:(NSData *)data
bucket:(NSString *)bucket
key:(NSString *)key
contentType:(NSString *)contentType
expression:(nullable AWSS3TransferUtilityUploadExpression *)expression
completionHandler:(nullable AWSS3TransferUtilityUploadCompletionHandlerBlock)completionHandler;參數說明
| 參數名 | 類型 | 說明 |
|---|---|---|
| bucket | NSString | bucket名 |
| key | NSString | 要上傳的對象名稱 |
| data | NSData | 文件內容 |
| contentType | NSString | 文件類型 |
| expression | AWSS3TransferUtilityUploadExpression | 其他參數,設置progress回調,設置acl |
| completionHandler | AWSS3TransferUtilityUploadCompletionHandlerBlock | 上傳文件結果回調 |
代碼示例
- (IBAction)start:(id)sender {
__weak UploadViewController *weakSelf = self;
NSString *fileName = @"test40M.mp4";
NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:nil];
NSData *fileData = [NSData dataWithContentsOfFile:path options:NSDataReadingMappedIfSafe error:nil];
AWSS3TransferUtilityUploadExpression * expression = [AWSS3TransferUtilityUploadExpression new];
//設置公共讀
//[expression setValue:@"public-read" forRequestHeader:@"x-amz-acl"];
expression.progressBlock = ^(AWSS3TransferUtilityTask * _Nonnull task, NSProgress * _Nonnull progress) {
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.progressView.progress = progress.fractionCompleted;
});
};
AWSS3TransferUtilityUploadCompletionHandlerBlock completionHandler = ^(AWSS3TransferUtilityUploadTask *task, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if(error) {
weakSelf.statusLabel.text = @"Failed to Upload";
} else {
weakSelf.statusLabel.text = @"Successfully Uploaded";
}
});
};
AWSS3TransferUtility *transferUtility = [AWSS3TransferUtility defaultS3TransferUtility];
[[transferUtility uploadData:fileData
bucket:self.mBucketName
key:fileName
contentType:@"video/mp4"
expression:expression
completionHandler:completionHandler] continueWithBlock:^id(AWSTask *task) {
if (task.error) {
NSLog(@"Error: %@", task.error);
return nil;
}
if (task.result) {
NSLog(@"Upload Starting!");
}
return nil;
}];
}標準接口
標準接口由以下接口組合完成分片上傳文件的功能:createMultipartUpload,uploadPart,completeMultipartUpload,abortMultipartUpload。
創建分片上傳任務
創建分片上傳任務,返回分片上傳任務的ID。
接口定義
- (AWSTask<AWSS3CreateMultipartUploadOutput *> *)createMultipartUpload:(AWSS3CreateMultipartUploadRequest *)request
- (void)createMultipartUpload:(AWSS3CreateMultipartUploadRequest *)request
completionHandler:(void (^)(AWSS3CreateMultipartUploadOutput *response, NSError *error))completionHandler參數說明
| 參數名 | 類型 | 說明 |
|---|---|---|
| bucket | NSString | bucket名 |
| key | NSString | 要上傳的對象名 |
| ACL | AWSS3ObjectCannedACL | 權限設置 |
代碼示例
AWSS3CreateMultipartUploadRequest *createReq = [AWSS3CreateMultipartUploadRequest new];
createReq.key = self.fileName;
createReq.bucket = self.bucketName;
__weak CTYunStorageTask *weakSelf = self;
?
[self.requestArray addObject:createReq];
?
[[[AWSS3 defaultS3] createMultipartUpload:createReq] continueWithBlock:^id _Nullable(AWSTask<AWSS3CreateMultipartUploadOutput *> * _Nonnull t)
{
dispatch_sync(weakSelf.queue, ^{
LOGI(@"createMultipartUpload success");
AWSS3CreateMultipartUploadOutput *outPut = t.result;
weakSelf.uploadId = outPut.uploadId;
[weakSelf.userDefault setObject:weakSelf.uploadId forKey:@"uploadId"];
[weakSelf uploadPartData:progressBlock success:completion failure:failure];
});
return nil;
}];上傳一個分片
獲取到分片任務ID之后,通過ID來上傳分片內容到S3服務器。
接口定義
- (AWSTask<AWSS3UploadPartOutput *> *)uploadPart:(AWSS3UploadPartRequest *)request
- (void)uploadPart:(AWSS3UploadPartRequest *)request
completionHandler:(void (^)(AWSS3UploadPartOutput *response, NSError *error))completionHandler參數說明
| 參數名 | 類型 | 說明 |
|---|---|---|
| bucket | NSString | bucket名 |
| key | NSString | 要上傳的對象名稱 |
| body | id | 上傳的文件內容(NSData) |
| uploadId | NSString | 上傳任務ID |
| contentLength | NSNumber | 上傳內容長度 |
| partNumber | NSNumber | 分片ID(1-10000) |
| uploadProgress | AWSNetworkingUploadProgressBlock | 上傳進度回調接口 |
代碼示例
AWSS3UploadPartRequest *uploadPartRequest = [AWSS3UploadPartRequest new];
uploadPartRequest.key = self.fileName;
uploadPartRequest.partNumber = @(i);
uploadPartRequest.body = partData;
uploadPartRequest.contentLength = @(dataLength);
uploadPartRequest.uploadId = self.uploadId;
uploadPartRequest.bucket = self.bucketName;
uploadPartRequest.uploadProgress = ^(int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend){
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.uploadByteSent += bytesSent;
int64_t fileSize = [self.fileData length];
if (weakSelf.uploadByteSent < fileSize){
weakSelf.progress = weakSelf.uploadByteSent/(fileSize*1.0);
progressBlock(weakSelf.progress);
}
});
};
[self.requestArray addObject:uploadPartRequest];
?
[[[AWSS3 defaultS3] uploadPart:uploadPartRequest] continueWithBlock:^id _Nullable(AWSTask<AWSS3UploadPartOutput *> * _Nonnull t)
{
LOGI(@"uploadPartData finished");
if (t.error){
weakSelf.isError = YES;
} else {
AWSS3UploadPartOutput *outputPart = t.result;
if (outputPart){
AWSS3CompletedPart *partObj = [AWSS3CompletedPart new];
partObj.partNumber = @(i);
partObj.ETag = outputPart.ETag;
NSDictionary *cacheDic = @{@"part":@(i), @"ETag":outputPart.ETag, @"size":@(dataLength)};
[weakSelf.partETags setObject:cacheDic forKey:[NSString stringWithFormat:@"%d", i]];
[weakSelf.mutArray addObject:partObj];
[weakSelf.userDefault setObject:weakSelf.partETags forKey:@"partArray"];
[weakSelf.userDefault synchronize];
} else {
LOGI(@"uploadPartData error, outputPart=nil");
}
}
dispatch_group_leave(group);
return nil;
}];完成分片上傳任務
完成所有分片的上傳之后,調用完成接口,服務端會把所有分片合并成對象保存。
接口定義
- (AWSTask<AWSS3CompleteMultipartUploadOutput *> *)completeMultipartUpload:(AWSS3CompleteMultipartUploadRequest *)request
- (void)completeMultipartUpload:(AWSS3CompleteMultipartUploadRequest *)request
completionHandler:(void (^)(AWSS3CompleteMultipartUploadOutput *response, NSError *error))completionHandler參數說明
| 參數名 | 類型 | 說明 |
|---|---|---|
| bucket | NSString | bucket名 |
| key | NSString | 要上傳的對象名 |
| uploadId | NSString | 上傳任務ID |
| multipartUpload | AWSS3CompletedMultipartUpload | 上傳的分片信息列表 |
代碼示例
- (void)uploadComplete:(void (^)(float progress))progressBlock
success:(void (^)(void))completion
failure:(void (^)(NSError *))failure
{
LOGI(@"uploadComplete send request");
AWSS3 *transferManager = [AWSS3 defaultS3];
AWSS3CompleteMultipartUploadRequest *completeUpload = [AWSS3CompleteMultipartUploadRequest new];
completeUpload.key = self.fileName;
completeUpload.uploadId = self.uploadId;
completeUpload.bucket = self.bucketName;
completeUpload.multipartUpload = [AWSS3CompletedMultipartUpload new];
completeUpload.multipartUpload.parts = [NSArray arrayWithArray:self.mutArray] ;
[self.requestArray addObject:completeUpload];
[[transferManager completeMultipartUpload:completeUpload] continueWithBlock:^id _Nullable(AWSTask<AWSS3CompleteMultipartUploadOutput *> * _Nonnull t) {
LOGI(@"uploadComplete recv response");
if (t.error) {
failure(t.error);
} else {
LOGI(@"uploadComplete success!");
self.progress = 1;
progressBlock(self.progress);
completion();
}
return nil;
}];
}終止分片上傳任務
上傳失敗的時候調用此接口,服務器會清除殘留的分片數據。
接口定義
- (AWSTask<AWSS3AbortMultipartUploadOutput *> *)abortMultipartUpload:(AWSS3AbortMultipartUploadRequest *)request;
?
- (void)abortMultipartUpload:(AWSS3AbortMultipartUploadRequest *)request completionHandler:(void (^ _Nullable)(AWSS3AbortMultipartUploadOutput * _Nullable response, NSError * _Nullable error))completionHandler;參數說明
| 參數名 | 類型 | 說明 |
|---|---|---|
| bucket | NSString | bucket名 |
| key | NSString | 要上傳的對象名 |
| uploadId | NSString | 上傳任務ID |
代碼示例
- (void) abortMultipartUpload:(NSString*) bucketName key:(NSString*)keyName uploadId:(NSString*)uploadId {
AWSS3AbortMultipartUploadRequest *request = [[AWSS3AbortMultipartUploadRequest alloc] init];
request.bucket = bucketName;
request.key = keyName;
request.uploadId = uploadId;
[self.s3 abortMultipartUpload:request completionHandler:^(AWSS3AbortMultipartUploadOutput * _Nullable response, NSError * _Nullable error) {
if (error != nil) {
NSLog(@"error: %@", error);
return;
}
NSLog(@"success");
}];
}