开发者社区 问答 正文

iOS-SDK之如何实现下载文件(二)?


流式下载


实际上,SDK没有提供stream类型的下载接口,但是提供了类似NSURLSession库的didRecieveData的分段回调功能,下载时,每次得到一段数据,会回调这个函数进行通知。注意,如果设置了这个回调,下载的结果将不再包含实际数据。

  1. OSSGetObjectRequest * request = [OSSGetObjectRequest new];
  2. // required
  3. request.bucketName = @"<bucketName>";
  4. request.objectKey = @"<objectKey>";
  5. // 分段回调函数
  6. request.onRecieveData = ^(NSData * data) {
  7.     NSLog(@"Recieve data, length: %ld", [data length]);
  8. };
  9. OSSTask * getTask = [client getObject:request];
  10. [getTask continueWithBlock:^id(OSSTask *task) {
  11.     if (!task.error) {
  12.         NSLog(@"download object success!");
  13.     } else {
  14.         NSLog(@"download object failed, error: %@" ,task.error);
  15.     }
  16.     return nil;
  17. }];
  18. // [getTask waitUntilFinished];
  19. // [request cancel];


指定范围下载


您可以在下载文件时指定一段范围,对于较大的Object适于使用此功能;如果在请求头中使用Range参数,则返回消息中会包含整个文件的长度和此次返回的范围。
  1. OSSGetObjectRequest * request = [OSSGetObjectRequest new];
  2. request.bucketName = @"<bucketName>;
  3. request.objectKey = @"<objectKey>";
  4. request.range = [[OSSRange alloc] initWithStart:1 withEnd:99]; // bytes=1-99
  5. // request.range = [[OSSRange alloc] initWithStart:-1 withEnd:99]; // bytes=-99
  6. // request.range = [[OSSRange alloc] initWithStart:10 withEnd:-1]; // bytes=10-
  7. request.downloadProgress = ^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
  8.     NSLog(@"%lld, %lld, %lld", bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
  9. };
  10. OSSTask * getTask = [client getObject:request];
  11. [getTask continueWithBlock:^id(OSSTask *task) {
  12.     if (!task.error) {
  13.         NSLog(@"download object success!");
  14.         OSSGetObjectResult * getResult = task.result;
  15.         NSLog(@"download result: %@", getResult.dowloadedData);
  16.     } else {
  17.         NSLog(@"download object failed, error: %@" ,task.error);
  18.     }
  19.     return nil;
  20. }];
  21. // [getTask waitUntilFinished];
  22. // [request cancel];


只获取文件元信息


通过headObject方法可以只获文件元信息而不获取文件的实体。代码如下:
  1. OSSHeadObjectRequest * request = [OSSHeadObjectRequest new];
  2. request.bucketName = @"<bucketName>;
  3. request.objectKey = @"<objectKey>";
  4. OSSTask * headTask = [client headObject:request];
  5. [headTask continueWithBlock:^id(OSSTask *task) {
  6.     if (!task.error) {
  7.         NSLog(@"head object success!");
  8.         OSSHeadObjectResult * result = task.result;
  9.         NSLog(@"header fields: %@", result.httpResponseHeaderFields);
  10.         for (NSString * key in result.objectMeta) {
  11.             NSLog(@"ObjectMeta: %@ - %@", key, [result.objectMeta objectForKey:key]);
  12.         }
  13.     } else {
  14.         NSLog(@"head object failed, error: %@" ,task.error);
  15.     }
  16.     return nil;
  17. }];

展开
收起
青衫无名 2017-10-18 14:08:30 1840 分享 版权
阿里云 AI 助理回答

您提到的这些示例代码片段是基于阿里云对象存储(OSS)的iOS SDK进行文件下载、指定范围下载以及获取文件元信息的操作。下面我将为您解释每个操作的含义和应用场景:

流式下载

虽然SDK没有直接提供一个"stream"类型的下载接口,但通过设置onRecieveData回调函数,您可以实现类似流式下载的功能。这意味着当从OSS下载大文件时,数据不是一次性全部加载到内存中,而是分段接收。每接收到一段数据,就会调用这个回调函数,这样可以有效减少内存占用,特别适合处理大文件下载。

指定范围下载

此功能允许您在请求中指定要下载的数据范围,格式如bytes=start-end。这对于只需要文件部分内容的场景非常有用,比如断点续传或者只查看文件某一部分内容。通过设定OSSRange,您可以精确控制下载的字节范围,提高效率并节省带宽。

只获取文件元信息

使用headObject方法,您可以查询一个OSS对象的基本信息而不实际下载该对象。这包括文件的大小、最后修改时间、存储类型等元数据。这对于需要检查文件是否存在或获取其属性而无需下载整个文件的场景非常有用,比如验证文件上传是否成功或获取文件的预览信息。

总结来说,阿里云OSS iOS SDK提供了灵活的文件操作接口,支持高效地处理各种文件下载需求,无论是流式处理大文件、按需下载特定范围,还是仅获取文件元数据,都能满足不同应用场景的需求。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答