开发者社区 问答 正文

iOS-SDK之如何实现上传文件(一)?


简单上传


上传Object可以直接上传OSSData,或者通过NSURL上传一个文件:

  1. OSSPutObjectRequest * put = [OSSPutObjectRequest new];
  2. // 必填字段
  3. put.bucketName = @"<bucketName>";
  4. put.objectKey = @"<objectKey>";
  5. put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];
  6. // put.uploadingData = <NSData *>; // 直接上传NSData
  7. // 可选字段,可不设置
  8. put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
  9.     // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度
  10.     NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
  11. };
  12. // 以下可选字段的含义参考: https://docs.aliyun.com/#/pub/oss/api-reference/object&PutObject
  13. // put.contentType = @"";
  14. // put.contentMd5 = @"";
  15. // put.contentEncoding = @"";
  16. // put.contentDisposition = @"";
  17. // put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; // 可以在上传时设置元信息或者其他HTTP头部
  18. OSSTask * putTask = [client putObject:put];
  19. [putTask continueWithBlock:^id(OSSTask *task) {
  20.     if (!task.error) {
  21.         NSLog(@"upload object success!");
  22.     } else {
  23.         NSLog(@"upload object failed, error: %@" , task.error);
  24.     }
  25.     return nil;
  26. }];
  27. // [putTask waitUntilFinished];
  28. // [put cancel];


上传到文件目录


OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。
如,在上传文件是,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。注意,路径默认是”根目录”,不需要以’/‘开头。

上传时设置Content-Type和开启校验MD5


上传时可以显式指定ContentType,如果没有指定,SDK会根据文件名或者上传的ObjectKey自动判断。另外,上传Object时如果设置了Content-Md5,那么OSS会用之检查消息内容是否与发送时一致。SDK提供了方便的Base64和MD5计算方法。
  1. OSSPutObjectRequest * put = [OSSPutObjectRequest new];
  2. // 必填字段
  3. put.bucketName = @"<bucketName>";
  4. put.objectKey = @"<objectKey>";
  5. put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];
  6. // put.uploadingData = <NSData *>; // 直接上传NSData
  7. // 设置Content-Type,可选
  8. put.contentType = @"application/octet-stream";
  9. // 设置MD5校验,可选
  10. put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // 如果是文件路径
  11. // put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>]; // 如果是二进制数据
  12. // 进度设置,可选
  13. put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
  14.     // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度
  15.     NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
  16. };
  17. OSSTask * putTask = [client putObject:put];
  18. [putTask continueWithBlock:^id(OSSTask *task) {
  19.     if (!task.error) {
  20.         NSLog(@"upload object success!");
  21.     } else {
  22.         NSLog(@"upload object failed, error: %@" , task.error);
  23.     }
  24.     return nil;
  25. }];
  26. // [putTask waitUntilFinished];
  27. // [put cancel];


追加上传


Append Object以追加写的方式上传文件。通过Append Object操作创建的Object类型为Appendable Object,而通过Put Object上传的Object是Normal Object。
  1. OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];
  2. // 必填字段
  3. append.bucketName = @"<bucketName>";
  4. append.objectKey = @"<objectKey>";
  5. append.appendPosition = 0; // 指定从何处进行追加
  6. NSString * docDir = [self getDocumentDirectory];
  7. append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];
  8. // 可选字段
  9. append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
  10.     NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
  11. };
  12. // 以下可选字段的含义参考:https://docs.aliyun.com/#/pub/oss/api-reference/object&AppendObject
  13. // append.contentType = @"";
  14. // append.contentMd5 = @"";
  15. // append.contentEncoding = @"";
  16. // append.contentDisposition = @"";
  17. OSSTask * appendTask = [client appendObject:append];
  18. [appendTask continueWithBlock:^id(OSSTask *task) {
  19.     NSLog(@"objectKey: %@", append.objectKey);
  20.     if (!task.error) {
  21.         NSLog(@"append object success!");
  22.         OSSAppendObjectResult * result = task.result;
  23.         NSString * etag = result.eTag;
  24.         long nextPosition = result.xOssNextAppendPosition;
  25.     } else {
  26.         NSLog(@"append object failed, error: %@" , task.error);
  27.     }
  28.     return nil;
  29. }];







展开
收起
青衫无名 2017-10-18 14:00:57 1864 分享 版权
0 条回答
写回答
取消 提交回答