开发者社区> 问答> 正文

OSS IOS SDK 流式下载

已解决

展开
收起
2018-07-23 20:36:07 991 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    详细解答可以参考官方帮助文档

    简单下载

    下载文件,可以指定下载为本地文件,或者下载为NSData:

    1. OSSGetObjectRequest * request = [OSSGetObjectRequest new];
    2. // 必填字段
    3. request.bucketName = @"<bucketName>";
    4. request.objectKey = @"<objectKey>";
    5. // 可选字段
    6. request.downloadProgress = ^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
    7. // 当前下载段长度、当前已经下载总长度、一共需要下载的总长度
    8. NSLog(@"%lld, %lld, %lld", bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
    9. };
    10. // request.range = [[OSSRange alloc] initWithStart:0 withEnd:99]; // bytes=0-99,指定范围下载
    11. // request.downloadToFileURL = [NSURL fileURLWithPath:@"<filepath>"]; // 如果需要直接下载到文件,需要指明目标文件地址
    12. OSSTask * getTask = [client getObject:request];
    13. [getTask continueWithBlock:^id(OSSTask *task) {
    14. if (!task.error) {
    15. NSLog(@"download object success!");
    16. OSSGetObjectResult * getResult = task.result;
    17. NSLog(@"download result: %@", getResult.dowloadedData);
    18. } else {
    19. NSLog(@"download object failed, error: %@" ,task.error);
    20. }
    21. return nil;
    22. }];
    23. // [getTask waitUntilFinished];
    24. // [request cancel];

    图片处理

    OSS图片处理,是OSS对外提供的海量、安全、低成本、高可靠的图片处理服务。用户将原始图片上传保存到OSS,通过简单的 RESTful 接口,在任何时间、任何地点、任何互联网设备上对图片进行处理。图片处理提供图片处理接口,图片上传请使用上传接口。基于OSS图片处理,用户可以搭建自己的图片处理服务。

    OSS图片处理提供以下功能:

    SDK中使用时,只需要在下载图片时,为request设置xOssProcess属性。示例:

    1. OSSGetObjectRequest * request = [OSSGetObjectRequest new];
    2. request.bucketName = @"<bucketName>";
    3. request.objectKey = @"example.jpg";
    4. // 图片处理
    5. request.xOssProcess = @"image/resize,m_lfit,w_100,h_100";
    6. OSSTask * getTask = [client getObject:request];
    7. [getTask continueWithBlock:^id(OSSTask *task) {
    8. if (!task.error) {
    9. NSLog(@"download image success!");
    10. OSSGetObjectResult * getResult = task.result;
    11. NSLog(@"download image data: %@", getResult.dowloadedData);
    12. } else {
    13. NSLog(@"download object failed, error: %@" ,task.error);
    14. }
    15. return nil;
    16. }];
    17. // [getTask waitUntilFinished];
    18. // [request cancel];

    需要对图片进行其它处理,只要替换request.xOssProcess的值就可以了。需要帮助,请参考:

    • 可视化图片处理工具 ImageStyleViever ,可以直观的看到OSS图片处理的结果
    • OSS图片处理的功能、使用演示 页面

    流式下载

    实际上,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. }];

    数据完整性校验

    因为移动端网络环境的复杂性,数据在客户端和服务器之间传输时有可能会出错。因此OSS SDK在下载过程中提供了基于CRC的端到端的数据完整性效验功能。

    CRC校验在读取下载过程中时候,如果开启了crc效验,并有在传输中有数据错误的情况。会提示OSSClientErrorCodeInvalidCRC的错误。注:如果用户

    1. OSSGetObjectRequest * request = [OSSGetObjectRequest new];
    2. request.bucketName = ...;
    3. //开启crc效验
    4. request.crcFlag = OSSRequestCRCOpen;
    5. OSSTask * task = [testProxyClient getObject:request];
    6. [[task continueWithBlock:^id(OSSTask *task) {
    7. //如果开启了crc效验,并有在传输中有数据错误的情况。会提示OSSClientErrorCodeInvalidCRC的错误
    8. XCTAssertNil(task.error);
    9. return nil;
    10. }] waitUntilFinished];
    11. 注:如果设置onReceiveData block。开启CRC效验后,需要自行比较CRC数值是否一致。范例如下
    12. OSSGetObjectRequest * request = [OSSGetObjectRequest new];
    13. request.bucketName = ....
    14. request.crcFlag = OSSRequestCRCOpen;
    15. ....
    16. __block uint64_t localCrc64 = 0;
    17. //如果设置onReceiveData block
    18. NSMutableData *receivedData = [NSMutableData data];
    19. request.onRecieveData = ^(NSData *data) {
    20. if (data)
    21. {
    22. NSMutableData *mutableData = [data mutableCopy];
    23. void *bytes = mutableData.mutableBytes;
    24. localCrc64 = [OSSUtil crc64ecma:localCrc64 buffer:bytes length:data.length];
    25. [receivedData appendData:data];
    26. }
    27. };
    28. __block uint64_t remoteCrc64 = 0;
    29. OSSTask * task = [_client getObject:request];
    30. [[task continueWithBlock:^id(OSSTask *task) {
    31. XCTAssertNil(task.error);
    32. OSSGetObjectResult *result = task.result;
    33. if (result.remoteCRC64ecma)
    34. {
    35. NSScanner *scanner = [NSScanner scannerWithString:result.remoteCRC64ecma];
    36. [scanner scanUnsignedLongLong:&remoteCrc64];
    37. if (remoteCrc64 == localCrc64)
    38. {
    39. NSLog(@"crc64校验成功!");
    40. }
    41. else
    42. {
    43. NSLog(@"crc64校验失败!");
    44. }
    45. }
    46. return nil;
    47. }] waitUntilFinished];
    2018-07-26 00:56:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
手淘iOS性能优化探索 立即下载
From Java/Android to Swift iOS 立即下载
深入剖析iOS性能优化 立即下载