• 关于

    对象存储 OSS数据完整性校验

    的搜索结果

回答

OSS 使用基于纠删码、多副本的数据冗余存储机制,将每个对象的不同冗余存储在同一个区域内多个设施的多个设备上,确保硬件失效时的数据可靠性和可用性。 OSS Object 操作具有强一致性,用户一旦收到了上传/复制成功的响应,则该上传的 Object 就已经立即可读,且数据已经冗余写入到多个设备中。 OSS 会通过计算网络流量包的校验和,验证数据包在客户端和服务端之间传输中是否出错,保证数据完整传输。 OSS 的冗余存储机制,可支持两个存储设施并发损坏时,仍维持数据不丢失。 当数据存入 OSS 后,OSS 会检测和修复丢失的冗余,确保数据可靠性和可用性。 2 OSS 会周期性地通过校验等方式验证数据的完整性,及时发现因硬件失效等原因造成的 数据损坏。当检测到数据有部分损坏或丢失时,OSS 会利用冗余的数据,进行重建并修复损坏数据。

剑曼红尘 2020-03-26 18:06:39 0 浏览量 回答数 0

回答

阿里云对象存储OSS,是阿里云提供的海量、安全、低成本、高可靠的云存储服务。本文将OSS与传统的自建存储进行对比,让您更好的了解OSS。 OSS与自建存储对比的优势 OSS具备的其他各项优势 方便、快捷的使用方式 提供标准的RESTful API接口、丰富的SDK包、客户端工具、控制台。您可以像使用文件一样方便地上传、下载、检索、管理用于Web网站或者移动应用的海量数据。 不限制存储空间大小。您可以根据所需存储量无限扩展存储空间,解决了传统硬件存储扩容问题。 支持流式写入和读出。特别适合视频等大文件的边写边读业务场景。 支持数据生命周期管理。您可以通过设置生命周期规则,将到期数据批量删除或者转储为更低成本的低频访问型存储或归档型存储。 强大、灵活的安全机制 灵活的鉴权,授权机制。提供STS和URL鉴权和授权机制、IP黑白名单、防盗链、主子账号等功能。 提供用户级别资源隔离机制和多集群同步机制(可选)。 数据冗余机制 OSS 采用数据冗余存储机制,将每个对象的不同冗余存储在同一个区域内多个设施的多个设备上,确保硬件失效时的数据可靠性和可用性。 OSS Object 操作具有强一致性,用户一旦收到了上传/复制成功的响应,则该上传的 Object 就已经立即可读,且数据已经冗余写入到多个设备中。 OSS 会通过计算网络流量包的校验和,验证数据包在客户端和服务端之间传输中是否出错,保证数据完整传输。 OSS 的冗余存储机制,可支持两个存储设施并发损坏时,仍维持数据不丢失。 当数据存入 OSS 后,OSS 会检测和修复丢失的冗余,确保数据可靠性和可用性。 OSS 会周期性地通过校验等方式验证数据的完整性,及时发现因硬件失效等原因造成的数据损坏。当检测到数据有部分损坏或丢失时,OSS 会利用冗余的数据,进行重建并修复损坏数据。 丰富、强大的增值服务 图片处理:支持jpg、png、bmp、gif、webp、tiff等多种图片格式的转换,以及缩略图、剪裁、水印、缩放等多种操作。 音视频转码:提供高质量、高速并行的音视频转码能力,让您的音视频文件轻松应对各种终端设备。 互联网访问加速:OSS提供传输加速服务,支持上传、下载加速,可优化跨洋、跨省数据上传、下载体验。详情请参见传输加速。 内容加速分发:OSS作为源站,搭配CDN进行内容分发,提升同一个文件,被大量重复下载的体验。

剑曼红尘 2020-03-26 17:33:33 0 浏览量 回答数 0

问题

对象存储 OSS数据完整性校验

2019-12-01 18:45:22 712 浏览量 回答数 1

Quick BI 数据可视化分析平台

2020年入选全球Gartner ABI魔力象限,为中国首个且唯一入选BI产品

问题

对象存储 OSS数据完整性校验

2019-12-01 18:45:27 393 浏览量 回答数 1

问题

对象存储 OSS数据完整性校验

2019-12-01 18:45:24 280 浏览量 回答数 1

回答

详细解答可以参考官方帮助文档OSS 移动端SDK 上传文件的方式可以分为:简单上传,追加上传,分片上传和断点续传。 简单上传上传Object可以直接上传OSSData,或者通过NSURL上传一个文件: OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 可选字段,可不设置put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考: https://docs.aliyun.com/#/pub/oss/api-reference/object&PutObject// put.contentType = @"";// put.contentMd5 = @"";// put.contentEncoding = @"";// put.contentDisposition = @"";// put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; // 可以在上传时设置元信息或者其他HTTP头部OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 上传到文件目录OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。 如,在上传文件是,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。注意,路径默认是”根目录”,不需要以’/‘开头。 上传时设置Content-Type和开启校验MD5上传时可以显式指定ContentType,如果没有指定,SDK会根据文件名或者上传的ObjectKey自动判断。另外,上传Object时如果设置了Content-Md5,那么OSS会用之检查消息内容是否与发送时一致。SDK提供了方便的Base64和MD5计算方法。 OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 设置Content-Type,可选put.contentType = @"application/octet-stream";// 设置MD5校验,可选put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // 如果是文件路径// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>]; // 如果是二进制数据// 进度设置,可选put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 追加上传Append Object以追加写的方式上传文件。通过Append Object操作创建的Object类型为Appendable Object,而通过Put Object上传的Object是Normal Object。 OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];// 必填字段append.bucketName = @"<bucketName>";append.objectKey = @"<objectKey>";append.appendPosition = 0; // 指定从何处进行追加NSString * docDir = [self getDocumentDirectory];append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// 可选字段append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考:https://docs.aliyun.com/#/pub/oss/api-reference/object&AppendObject// append.contentType = @"";// append.contentMd5 = @"";// append.contentEncoding = @"";// append.contentDisposition = @"";OSSTask * appendTask = [client appendObject:append];[appendTask continueWithBlock:^id(OSSTask *task) { NSLog(@"objectKey: %@", append.objectKey); if (!task.error) { NSLog(@"append object success!"); OSSAppendObjectResult * result = task.result; NSString * etag = result.eTag; long nextPosition = result.xOssNextAppendPosition; } else { NSLog(@"append object failed, error: %@" , task.error); } return nil;}]; 上传后回调通知客户端在上传Object时可以指定OSS服务端在处理完上传请求后,通知您的业务服务器,在该服务器确认接收了该回调后将回调的结果返回给客户端。因为加入了回调请求和响应的过程,相比简单上传,使用回调通知机制一般会导致客户端花费更多的等待时间。 具体说明参考:Callback 代码示例: OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = @"<bucketName>";request.objectKey = @"<objectKey>";request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];// 设置回调参数request.callbackParam = @{ @"callbackUrl": @"<your server callback address>", @"callbackBody": @"<your callback body>" };// 设置自定义变量request.callbackVar = @{ @"<var1>": @"<value1>", @"<var2>": @"<value2>" };request.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * task = [client putObject:request];[task continueWithBlock:^id(OSSTask *task) { if (task.error) { OSSLogError(@"%@", task.error); } else { OSSPutObjectResult * result = task.result; NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@", result.requestId, result.httpResponseHeaderFields, result.serverReturnJsonString); } return nil;}]; 分片上传因为篇幅的原因,分片上传参考:分片上传 断点续传 特别注意: 断点续传暂时只支持上传本地文件。 对于移动端来说,如果不是比较大的文件,不建议使用这种方式上传,因为断点续传是通过分片上传实现的,上传单个文件需要进行多次网络请求,效率不高。** 在无线网络下,上传比较大的文件持续时间长,可能会遇到因为网络条件差、用户切换网络等原因导致上传中途失败,整个文件需要重新上传。为此,SDK提供了断点上传功能。 在上传前,可以指定断点记录的保存文件夹。若不进行此项设置,断点上传只在本次上传生效,某个分片因为网络原因等上传失败时会进行重试,避免整个大文件重新上传,节省重试时间和耗用流量。如果设置了断点记录的保存文件夹,如果任务失败,在下次重新启动任务,上传同一文件到同一Bucket、Object时,如果用户设置取消时不删除断点记录。再次上传将从断点记录处继续上传。详见随后的范例。 断点续传失败时,如果同一任务一直得不到续传,可能会在OSS上积累无用碎片。对这种情况,可以为Bucket设置lifeCycle规则,定时清理碎片。参考:生命周期管理。 出于碎片管理的原因,如果在断点续传时取消当前任务。默认会同步清理已经上传到服务器的分片。如果取消时需要保留断点上传记录,需要指定断点记录的保存文件夹并修改deleteUploadIdOnCancelling参数。需要注意,如果本地保留记录时间过长,且Bucket设置lifeCycle规则定时清理了服务端分片。会出现服务端和移动端记录不一致的问题。 说明: 断点续传的实现依赖InitMultipartUpload/UploadPart/ListParts/CompleteMultipartUpload/AbortMultipartUpload,如果采用STS鉴权模式,请注意加上这些API所需的权限。 断点续传也支持上传后回调通知,用法和上述普通上传回调通知一致。 断点续传已经默认开启每个分片上传时的Md5校验,请勿重复在request中设置Content-Md5头部。 在本地持久保存断点记录的调用方式(默认是不设置): OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = OSS_BUCKET_PRIVATE;//...NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];resumableUpload.recordDirectoryPath = cachesDir; 断点续传功能实现 // 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = <bucketName>;resumableUpload.objectKey = <objectKey>;resumableUpload.partSize = 1024 * 1024;resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];//设置断点记录文件resumableUpload.recordDirectoryPath = cachesDir;//设置NO,取消时,不删除断点记录文件,如果不进行设置,默认YES,是会删除断点记录文件,下次再进行上传时会重新上传。resumableUpload.deleteUploadIdOnCancelling = NO;resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];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;}];// [resumeTask waitUntilFinished];// [resumableUpload cancel]; 数据完整性校验因为移动端网络环境的复杂性,OSS SDK提供了基于MD5和CRC64的端到端的数据完整性验证功能。 MD5校验 需要在上传文件时提供文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,只有在OSS服务器计算接收到的文件得到的MD5值和上传提供的MD5一致时才可以上传成功,从而保证上传数据的完整性。 OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = BUCKET_NAME;...request.contentMd5 = [OSSUtil fileMD5String:filepath]; CRC校验 与MD5相比,CRC64可以同时上传并计算CRC值。 // 构造上传请求OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = OSS_BUCKET_PRIVATE;///....request.crcFlag = OSSRequestCRCOpen;// 开启crc效验后。如果在传输中数据不一致,会提示OSSClientErrorCodeInvalidCRC 错误。OSSTask * task = [_client putObject:request];[[task continueWithBlock:^id(OSSTask *task) { //如果crc效验失败,会有error XCTAssertNil(task.error); return nil;}] waitUntilFinished];

2019-12-01 23:14:07 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档OSS 移动端SDK 上传文件的方式可以分为:简单上传,追加上传,分片上传和断点续传。 简单上传上传Object可以直接上传OSSData,或者通过NSURL上传一个文件: OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 可选字段,可不设置put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考: https://docs.aliyun.com/#/pub/oss/api-reference/object&PutObject// put.contentType = @"";// put.contentMd5 = @"";// put.contentEncoding = @"";// put.contentDisposition = @"";// put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; // 可以在上传时设置元信息或者其他HTTP头部OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 上传到文件目录OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。 如,在上传文件是,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。注意,路径默认是”根目录”,不需要以’/‘开头。 上传时设置Content-Type和开启校验MD5上传时可以显式指定ContentType,如果没有指定,SDK会根据文件名或者上传的ObjectKey自动判断。另外,上传Object时如果设置了Content-Md5,那么OSS会用之检查消息内容是否与发送时一致。SDK提供了方便的Base64和MD5计算方法。 OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 设置Content-Type,可选put.contentType = @"application/octet-stream";// 设置MD5校验,可选put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // 如果是文件路径// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>]; // 如果是二进制数据// 进度设置,可选put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 追加上传Append Object以追加写的方式上传文件。通过Append Object操作创建的Object类型为Appendable Object,而通过Put Object上传的Object是Normal Object。 OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];// 必填字段append.bucketName = @"<bucketName>";append.objectKey = @"<objectKey>";append.appendPosition = 0; // 指定从何处进行追加NSString * docDir = [self getDocumentDirectory];append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// 可选字段append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考:https://docs.aliyun.com/#/pub/oss/api-reference/object&AppendObject// append.contentType = @"";// append.contentMd5 = @"";// append.contentEncoding = @"";// append.contentDisposition = @"";OSSTask * appendTask = [client appendObject:append];[appendTask continueWithBlock:^id(OSSTask *task) { NSLog(@"objectKey: %@", append.objectKey); if (!task.error) { NSLog(@"append object success!"); OSSAppendObjectResult * result = task.result; NSString * etag = result.eTag; long nextPosition = result.xOssNextAppendPosition; } else { NSLog(@"append object failed, error: %@" , task.error); } return nil;}]; 上传后回调通知客户端在上传Object时可以指定OSS服务端在处理完上传请求后,通知您的业务服务器,在该服务器确认接收了该回调后将回调的结果返回给客户端。因为加入了回调请求和响应的过程,相比简单上传,使用回调通知机制一般会导致客户端花费更多的等待时间。 具体说明参考:Callback 代码示例: OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = @"<bucketName>";request.objectKey = @"<objectKey>";request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];// 设置回调参数request.callbackParam = @{ @"callbackUrl": @"<your server callback address>", @"callbackBody": @"<your callback body>" };// 设置自定义变量request.callbackVar = @{ @"<var1>": @"<value1>", @"<var2>": @"<value2>" };request.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * task = [client putObject:request];[task continueWithBlock:^id(OSSTask *task) { if (task.error) { OSSLogError(@"%@", task.error); } else { OSSPutObjectResult * result = task.result; NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@", result.requestId, result.httpResponseHeaderFields, result.serverReturnJsonString); } return nil;}]; 分片上传因为篇幅的原因,分片上传参考:分片上传 断点续传 特别注意: 断点续传暂时只支持上传本地文件。 对于移动端来说,如果不是比较大的文件,不建议使用这种方式上传,因为断点续传是通过分片上传实现的,上传单个文件需要进行多次网络请求,效率不高。** 在无线网络下,上传比较大的文件持续时间长,可能会遇到因为网络条件差、用户切换网络等原因导致上传中途失败,整个文件需要重新上传。为此,SDK提供了断点上传功能。 在上传前,可以指定断点记录的保存文件夹。若不进行此项设置,断点上传只在本次上传生效,某个分片因为网络原因等上传失败时会进行重试,避免整个大文件重新上传,节省重试时间和耗用流量。如果设置了断点记录的保存文件夹,如果任务失败,在下次重新启动任务,上传同一文件到同一Bucket、Object时,如果用户设置取消时不删除断点记录。再次上传将从断点记录处继续上传。详见随后的范例。 断点续传失败时,如果同一任务一直得不到续传,可能会在OSS上积累无用碎片。对这种情况,可以为Bucket设置lifeCycle规则,定时清理碎片。参考:生命周期管理。 出于碎片管理的原因,如果在断点续传时取消当前任务。默认会同步清理已经上传到服务器的分片。如果取消时需要保留断点上传记录,需要指定断点记录的保存文件夹并修改deleteUploadIdOnCancelling参数。需要注意,如果本地保留记录时间过长,且Bucket设置lifeCycle规则定时清理了服务端分片。会出现服务端和移动端记录不一致的问题。 说明: 断点续传的实现依赖InitMultipartUpload/UploadPart/ListParts/CompleteMultipartUpload/AbortMultipartUpload,如果采用STS鉴权模式,请注意加上这些API所需的权限。 断点续传也支持上传后回调通知,用法和上述普通上传回调通知一致。 断点续传已经默认开启每个分片上传时的Md5校验,请勿重复在request中设置Content-Md5头部。 在本地持久保存断点记录的调用方式(默认是不设置): OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = OSS_BUCKET_PRIVATE;//...NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];resumableUpload.recordDirectoryPath = cachesDir; 断点续传功能实现 // 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = <bucketName>;resumableUpload.objectKey = <objectKey>;resumableUpload.partSize = 1024 * 1024;resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];//设置断点记录文件resumableUpload.recordDirectoryPath = cachesDir;//设置NO,取消时,不删除断点记录文件,如果不进行设置,默认YES,是会删除断点记录文件,下次再进行上传时会重新上传。resumableUpload.deleteUploadIdOnCancelling = NO;resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];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;}];// [resumeTask waitUntilFinished];// [resumableUpload cancel]; 数据完整性校验因为移动端网络环境的复杂性,OSS SDK提供了基于MD5和CRC64的端到端的数据完整性验证功能。 MD5校验 需要在上传文件时提供文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,只有在OSS服务器计算接收到的文件得到的MD5值和上传提供的MD5一致时才可以上传成功,从而保证上传数据的完整性。 OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = BUCKET_NAME;...request.contentMd5 = [OSSUtil fileMD5String:filepath]; CRC校验 与MD5相比,CRC64可以同时上传并计算CRC值。 // 构造上传请求OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = OSS_BUCKET_PRIVATE;///....request.crcFlag = OSSRequestCRCOpen;// 开启crc效验后。如果在传输中数据不一致,会提示OSSClientErrorCodeInvalidCRC 错误。OSSTask * task = [_client putObject:request];[[task continueWithBlock:^id(OSSTask *task) { //如果crc效验失败,会有error XCTAssertNil(task.error); return nil;}] waitUntilFinished];

2019-12-01 23:14:07 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档OSS 移动端SDK 上传文件的方式可以分为:简单上传,追加上传,分片上传和断点续传。 简单上传上传Object可以直接上传OSSData,或者通过NSURL上传一个文件: OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 可选字段,可不设置put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考: https://docs.aliyun.com/#/pub/oss/api-reference/object&PutObject// put.contentType = @"";// put.contentMd5 = @"";// put.contentEncoding = @"";// put.contentDisposition = @"";// put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; // 可以在上传时设置元信息或者其他HTTP头部OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 上传到文件目录OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。 如,在上传文件是,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。注意,路径默认是”根目录”,不需要以’/‘开头。 上传时设置Content-Type和开启校验MD5上传时可以显式指定ContentType,如果没有指定,SDK会根据文件名或者上传的ObjectKey自动判断。另外,上传Object时如果设置了Content-Md5,那么OSS会用之检查消息内容是否与发送时一致。SDK提供了方便的Base64和MD5计算方法。 OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 设置Content-Type,可选put.contentType = @"application/octet-stream";// 设置MD5校验,可选put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // 如果是文件路径// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>]; // 如果是二进制数据// 进度设置,可选put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 追加上传Append Object以追加写的方式上传文件。通过Append Object操作创建的Object类型为Appendable Object,而通过Put Object上传的Object是Normal Object。 OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];// 必填字段append.bucketName = @"<bucketName>";append.objectKey = @"<objectKey>";append.appendPosition = 0; // 指定从何处进行追加NSString * docDir = [self getDocumentDirectory];append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// 可选字段append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考:https://docs.aliyun.com/#/pub/oss/api-reference/object&AppendObject// append.contentType = @"";// append.contentMd5 = @"";// append.contentEncoding = @"";// append.contentDisposition = @"";OSSTask * appendTask = [client appendObject:append];[appendTask continueWithBlock:^id(OSSTask *task) { NSLog(@"objectKey: %@", append.objectKey); if (!task.error) { NSLog(@"append object success!"); OSSAppendObjectResult * result = task.result; NSString * etag = result.eTag; long nextPosition = result.xOssNextAppendPosition; } else { NSLog(@"append object failed, error: %@" , task.error); } return nil;}]; 上传后回调通知客户端在上传Object时可以指定OSS服务端在处理完上传请求后,通知您的业务服务器,在该服务器确认接收了该回调后将回调的结果返回给客户端。因为加入了回调请求和响应的过程,相比简单上传,使用回调通知机制一般会导致客户端花费更多的等待时间。 具体说明参考:Callback 代码示例: OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = @"<bucketName>";request.objectKey = @"<objectKey>";request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];// 设置回调参数request.callbackParam = @{ @"callbackUrl": @"<your server callback address>", @"callbackBody": @"<your callback body>" };// 设置自定义变量request.callbackVar = @{ @"<var1>": @"<value1>", @"<var2>": @"<value2>" };request.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * task = [client putObject:request];[task continueWithBlock:^id(OSSTask *task) { if (task.error) { OSSLogError(@"%@", task.error); } else { OSSPutObjectResult * result = task.result; NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@", result.requestId, result.httpResponseHeaderFields, result.serverReturnJsonString); } return nil;}]; 分片上传因为篇幅的原因,分片上传参考:分片上传 断点续传 特别注意: 断点续传暂时只支持上传本地文件。 对于移动端来说,如果不是比较大的文件,不建议使用这种方式上传,因为断点续传是通过分片上传实现的,上传单个文件需要进行多次网络请求,效率不高。** 在无线网络下,上传比较大的文件持续时间长,可能会遇到因为网络条件差、用户切换网络等原因导致上传中途失败,整个文件需要重新上传。为此,SDK提供了断点上传功能。 在上传前,可以指定断点记录的保存文件夹。若不进行此项设置,断点上传只在本次上传生效,某个分片因为网络原因等上传失败时会进行重试,避免整个大文件重新上传,节省重试时间和耗用流量。如果设置了断点记录的保存文件夹,如果任务失败,在下次重新启动任务,上传同一文件到同一Bucket、Object时,如果用户设置取消时不删除断点记录。再次上传将从断点记录处继续上传。详见随后的范例。 断点续传失败时,如果同一任务一直得不到续传,可能会在OSS上积累无用碎片。对这种情况,可以为Bucket设置lifeCycle规则,定时清理碎片。参考:生命周期管理。 出于碎片管理的原因,如果在断点续传时取消当前任务。默认会同步清理已经上传到服务器的分片。如果取消时需要保留断点上传记录,需要指定断点记录的保存文件夹并修改deleteUploadIdOnCancelling参数。需要注意,如果本地保留记录时间过长,且Bucket设置lifeCycle规则定时清理了服务端分片。会出现服务端和移动端记录不一致的问题。 说明: 断点续传的实现依赖InitMultipartUpload/UploadPart/ListParts/CompleteMultipartUpload/AbortMultipartUpload,如果采用STS鉴权模式,请注意加上这些API所需的权限。 断点续传也支持上传后回调通知,用法和上述普通上传回调通知一致。 断点续传已经默认开启每个分片上传时的Md5校验,请勿重复在request中设置Content-Md5头部。 在本地持久保存断点记录的调用方式(默认是不设置): OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = OSS_BUCKET_PRIVATE;//...NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];resumableUpload.recordDirectoryPath = cachesDir; 断点续传功能实现 // 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = <bucketName>;resumableUpload.objectKey = <objectKey>;resumableUpload.partSize = 1024 * 1024;resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];//设置断点记录文件resumableUpload.recordDirectoryPath = cachesDir;//设置NO,取消时,不删除断点记录文件,如果不进行设置,默认YES,是会删除断点记录文件,下次再进行上传时会重新上传。resumableUpload.deleteUploadIdOnCancelling = NO;resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];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;}];// [resumeTask waitUntilFinished];// [resumableUpload cancel]; 数据完整性校验因为移动端网络环境的复杂性,OSS SDK提供了基于MD5和CRC64的端到端的数据完整性验证功能。 MD5校验 需要在上传文件时提供文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,只有在OSS服务器计算接收到的文件得到的MD5值和上传提供的MD5一致时才可以上传成功,从而保证上传数据的完整性。 OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = BUCKET_NAME;...request.contentMd5 = [OSSUtil fileMD5String:filepath]; CRC校验 与MD5相比,CRC64可以同时上传并计算CRC值。 // 构造上传请求OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = OSS_BUCKET_PRIVATE;///....request.crcFlag = OSSRequestCRCOpen;// 开启crc效验后。如果在传输中数据不一致,会提示OSSClientErrorCodeInvalidCRC 错误。OSSTask * task = [_client putObject:request];[[task continueWithBlock:^id(OSSTask *task) { //如果crc效验失败,会有error XCTAssertNil(task.error); return nil;}] waitUntilFinished];

2019-12-01 23:14:08 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档OSS 移动端SDK 上传文件的方式可以分为:简单上传,追加上传,分片上传和断点续传。 简单上传上传Object可以直接上传OSSData,或者通过NSURL上传一个文件: OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 可选字段,可不设置put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考: https://docs.aliyun.com/#/pub/oss/api-reference/object&PutObject// put.contentType = @"";// put.contentMd5 = @"";// put.contentEncoding = @"";// put.contentDisposition = @"";// put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; // 可以在上传时设置元信息或者其他HTTP头部OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 上传到文件目录OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。 如,在上传文件是,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。注意,路径默认是”根目录”,不需要以’/‘开头。 上传时设置Content-Type和开启校验MD5上传时可以显式指定ContentType,如果没有指定,SDK会根据文件名或者上传的ObjectKey自动判断。另外,上传Object时如果设置了Content-Md5,那么OSS会用之检查消息内容是否与发送时一致。SDK提供了方便的Base64和MD5计算方法。 OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 设置Content-Type,可选put.contentType = @"application/octet-stream";// 设置MD5校验,可选put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // 如果是文件路径// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>]; // 如果是二进制数据// 进度设置,可选put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 追加上传Append Object以追加写的方式上传文件。通过Append Object操作创建的Object类型为Appendable Object,而通过Put Object上传的Object是Normal Object。 OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];// 必填字段append.bucketName = @"<bucketName>";append.objectKey = @"<objectKey>";append.appendPosition = 0; // 指定从何处进行追加NSString * docDir = [self getDocumentDirectory];append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// 可选字段append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考:https://docs.aliyun.com/#/pub/oss/api-reference/object&AppendObject// append.contentType = @"";// append.contentMd5 = @"";// append.contentEncoding = @"";// append.contentDisposition = @"";OSSTask * appendTask = [client appendObject:append];[appendTask continueWithBlock:^id(OSSTask *task) { NSLog(@"objectKey: %@", append.objectKey); if (!task.error) { NSLog(@"append object success!"); OSSAppendObjectResult * result = task.result; NSString * etag = result.eTag; long nextPosition = result.xOssNextAppendPosition; } else { NSLog(@"append object failed, error: %@" , task.error); } return nil;}]; 上传后回调通知客户端在上传Object时可以指定OSS服务端在处理完上传请求后,通知您的业务服务器,在该服务器确认接收了该回调后将回调的结果返回给客户端。因为加入了回调请求和响应的过程,相比简单上传,使用回调通知机制一般会导致客户端花费更多的等待时间。 具体说明参考:Callback 代码示例: OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = @"<bucketName>";request.objectKey = @"<objectKey>";request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];// 设置回调参数request.callbackParam = @{ @"callbackUrl": @"<your server callback address>", @"callbackBody": @"<your callback body>" };// 设置自定义变量request.callbackVar = @{ @"<var1>": @"<value1>", @"<var2>": @"<value2>" };request.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * task = [client putObject:request];[task continueWithBlock:^id(OSSTask *task) { if (task.error) { OSSLogError(@"%@", task.error); } else { OSSPutObjectResult * result = task.result; NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@", result.requestId, result.httpResponseHeaderFields, result.serverReturnJsonString); } return nil;}]; 分片上传因为篇幅的原因,分片上传参考:分片上传 断点续传 特别注意: 断点续传暂时只支持上传本地文件。 对于移动端来说,如果不是比较大的文件,不建议使用这种方式上传,因为断点续传是通过分片上传实现的,上传单个文件需要进行多次网络请求,效率不高。** 在无线网络下,上传比较大的文件持续时间长,可能会遇到因为网络条件差、用户切换网络等原因导致上传中途失败,整个文件需要重新上传。为此,SDK提供了断点上传功能。 在上传前,可以指定断点记录的保存文件夹。若不进行此项设置,断点上传只在本次上传生效,某个分片因为网络原因等上传失败时会进行重试,避免整个大文件重新上传,节省重试时间和耗用流量。如果设置了断点记录的保存文件夹,如果任务失败,在下次重新启动任务,上传同一文件到同一Bucket、Object时,如果用户设置取消时不删除断点记录。再次上传将从断点记录处继续上传。详见随后的范例。 断点续传失败时,如果同一任务一直得不到续传,可能会在OSS上积累无用碎片。对这种情况,可以为Bucket设置lifeCycle规则,定时清理碎片。参考:生命周期管理。 出于碎片管理的原因,如果在断点续传时取消当前任务。默认会同步清理已经上传到服务器的分片。如果取消时需要保留断点上传记录,需要指定断点记录的保存文件夹并修改deleteUploadIdOnCancelling参数。需要注意,如果本地保留记录时间过长,且Bucket设置lifeCycle规则定时清理了服务端分片。会出现服务端和移动端记录不一致的问题。 说明: 断点续传的实现依赖InitMultipartUpload/UploadPart/ListParts/CompleteMultipartUpload/AbortMultipartUpload,如果采用STS鉴权模式,请注意加上这些API所需的权限。 断点续传也支持上传后回调通知,用法和上述普通上传回调通知一致。 断点续传已经默认开启每个分片上传时的Md5校验,请勿重复在request中设置Content-Md5头部。 在本地持久保存断点记录的调用方式(默认是不设置): OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = OSS_BUCKET_PRIVATE;//...NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];resumableUpload.recordDirectoryPath = cachesDir; 断点续传功能实现 // 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = <bucketName>;resumableUpload.objectKey = <objectKey>;resumableUpload.partSize = 1024 * 1024;resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];//设置断点记录文件resumableUpload.recordDirectoryPath = cachesDir;//设置NO,取消时,不删除断点记录文件,如果不进行设置,默认YES,是会删除断点记录文件,下次再进行上传时会重新上传。resumableUpload.deleteUploadIdOnCancelling = NO;resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];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;}];// [resumeTask waitUntilFinished];// [resumableUpload cancel]; 数据完整性校验因为移动端网络环境的复杂性,OSS SDK提供了基于MD5和CRC64的端到端的数据完整性验证功能。 MD5校验 需要在上传文件时提供文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,只有在OSS服务器计算接收到的文件得到的MD5值和上传提供的MD5一致时才可以上传成功,从而保证上传数据的完整性。 OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = BUCKET_NAME;...request.contentMd5 = [OSSUtil fileMD5String:filepath]; CRC校验 与MD5相比,CRC64可以同时上传并计算CRC值。 // 构造上传请求OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = OSS_BUCKET_PRIVATE;///....request.crcFlag = OSSRequestCRCOpen;// 开启crc效验后。如果在传输中数据不一致,会提示OSSClientErrorCodeInvalidCRC 错误。OSSTask * task = [_client putObject:request];[[task continueWithBlock:^id(OSSTask *task) { //如果crc效验失败,会有error XCTAssertNil(task.error); return nil;}] waitUntilFinished];

2019-12-01 23:14:08 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档OSS 移动端SDK 上传文件的方式可以分为:简单上传,追加上传,分片上传和断点续传。 简单上传上传Object可以直接上传OSSData,或者通过NSURL上传一个文件: OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 可选字段,可不设置put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考: https://docs.aliyun.com/#/pub/oss/api-reference/object&PutObject// put.contentType = @"";// put.contentMd5 = @"";// put.contentEncoding = @"";// put.contentDisposition = @"";// put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; // 可以在上传时设置元信息或者其他HTTP头部OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 上传到文件目录OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。 如,在上传文件是,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。注意,路径默认是”根目录”,不需要以’/‘开头。 上传时设置Content-Type和开启校验MD5上传时可以显式指定ContentType,如果没有指定,SDK会根据文件名或者上传的ObjectKey自动判断。另外,上传Object时如果设置了Content-Md5,那么OSS会用之检查消息内容是否与发送时一致。SDK提供了方便的Base64和MD5计算方法。 OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 设置Content-Type,可选put.contentType = @"application/octet-stream";// 设置MD5校验,可选put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // 如果是文件路径// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>]; // 如果是二进制数据// 进度设置,可选put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 追加上传Append Object以追加写的方式上传文件。通过Append Object操作创建的Object类型为Appendable Object,而通过Put Object上传的Object是Normal Object。 OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];// 必填字段append.bucketName = @"<bucketName>";append.objectKey = @"<objectKey>";append.appendPosition = 0; // 指定从何处进行追加NSString * docDir = [self getDocumentDirectory];append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// 可选字段append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考:https://docs.aliyun.com/#/pub/oss/api-reference/object&AppendObject// append.contentType = @"";// append.contentMd5 = @"";// append.contentEncoding = @"";// append.contentDisposition = @"";OSSTask * appendTask = [client appendObject:append];[appendTask continueWithBlock:^id(OSSTask *task) { NSLog(@"objectKey: %@", append.objectKey); if (!task.error) { NSLog(@"append object success!"); OSSAppendObjectResult * result = task.result; NSString * etag = result.eTag; long nextPosition = result.xOssNextAppendPosition; } else { NSLog(@"append object failed, error: %@" , task.error); } return nil;}]; 上传后回调通知客户端在上传Object时可以指定OSS服务端在处理完上传请求后,通知您的业务服务器,在该服务器确认接收了该回调后将回调的结果返回给客户端。因为加入了回调请求和响应的过程,相比简单上传,使用回调通知机制一般会导致客户端花费更多的等待时间。 具体说明参考:Callback 代码示例: OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = @"<bucketName>";request.objectKey = @"<objectKey>";request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];// 设置回调参数request.callbackParam = @{ @"callbackUrl": @"<your server callback address>", @"callbackBody": @"<your callback body>" };// 设置自定义变量request.callbackVar = @{ @"<var1>": @"<value1>", @"<var2>": @"<value2>" };request.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * task = [client putObject:request];[task continueWithBlock:^id(OSSTask *task) { if (task.error) { OSSLogError(@"%@", task.error); } else { OSSPutObjectResult * result = task.result; NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@", result.requestId, result.httpResponseHeaderFields, result.serverReturnJsonString); } return nil;}]; 分片上传因为篇幅的原因,分片上传参考:分片上传 断点续传 特别注意: 断点续传暂时只支持上传本地文件。 对于移动端来说,如果不是比较大的文件,不建议使用这种方式上传,因为断点续传是通过分片上传实现的,上传单个文件需要进行多次网络请求,效率不高。** 在无线网络下,上传比较大的文件持续时间长,可能会遇到因为网络条件差、用户切换网络等原因导致上传中途失败,整个文件需要重新上传。为此,SDK提供了断点上传功能。 在上传前,可以指定断点记录的保存文件夹。若不进行此项设置,断点上传只在本次上传生效,某个分片因为网络原因等上传失败时会进行重试,避免整个大文件重新上传,节省重试时间和耗用流量。如果设置了断点记录的保存文件夹,如果任务失败,在下次重新启动任务,上传同一文件到同一Bucket、Object时,如果用户设置取消时不删除断点记录。再次上传将从断点记录处继续上传。详见随后的范例。 断点续传失败时,如果同一任务一直得不到续传,可能会在OSS上积累无用碎片。对这种情况,可以为Bucket设置lifeCycle规则,定时清理碎片。参考:生命周期管理。 出于碎片管理的原因,如果在断点续传时取消当前任务。默认会同步清理已经上传到服务器的分片。如果取消时需要保留断点上传记录,需要指定断点记录的保存文件夹并修改deleteUploadIdOnCancelling参数。需要注意,如果本地保留记录时间过长,且Bucket设置lifeCycle规则定时清理了服务端分片。会出现服务端和移动端记录不一致的问题。 说明: 断点续传的实现依赖InitMultipartUpload/UploadPart/ListParts/CompleteMultipartUpload/AbortMultipartUpload,如果采用STS鉴权模式,请注意加上这些API所需的权限。 断点续传也支持上传后回调通知,用法和上述普通上传回调通知一致。 断点续传已经默认开启每个分片上传时的Md5校验,请勿重复在request中设置Content-Md5头部。 在本地持久保存断点记录的调用方式(默认是不设置): OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = OSS_BUCKET_PRIVATE;//...NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];resumableUpload.recordDirectoryPath = cachesDir; 断点续传功能实现 // 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = <bucketName>;resumableUpload.objectKey = <objectKey>;resumableUpload.partSize = 1024 * 1024;resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];//设置断点记录文件resumableUpload.recordDirectoryPath = cachesDir;//设置NO,取消时,不删除断点记录文件,如果不进行设置,默认YES,是会删除断点记录文件,下次再进行上传时会重新上传。resumableUpload.deleteUploadIdOnCancelling = NO;resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];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;}];// [resumeTask waitUntilFinished];// [resumableUpload cancel]; 数据完整性校验因为移动端网络环境的复杂性,OSS SDK提供了基于MD5和CRC64的端到端的数据完整性验证功能。 MD5校验 需要在上传文件时提供文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,只有在OSS服务器计算接收到的文件得到的MD5值和上传提供的MD5一致时才可以上传成功,从而保证上传数据的完整性。 OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = BUCKET_NAME;...request.contentMd5 = [OSSUtil fileMD5String:filepath]; CRC校验 与MD5相比,CRC64可以同时上传并计算CRC值。 // 构造上传请求OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = OSS_BUCKET_PRIVATE;///....request.crcFlag = OSSRequestCRCOpen;// 开启crc效验后。如果在传输中数据不一致,会提示OSSClientErrorCodeInvalidCRC 错误。OSSTask * task = [_client putObject:request];[[task continueWithBlock:^id(OSSTask *task) { //如果crc效验失败,会有error XCTAssertNil(task.error); return nil;}] waitUntilFinished];

2019-12-01 23:14:07 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档OSS 移动端SDK 上传文件的方式可以分为:简单上传,追加上传,分片上传和断点续传。 简单上传上传Object可以直接上传OSSData,或者通过NSURL上传一个文件: OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 可选字段,可不设置put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考: https://docs.aliyun.com/#/pub/oss/api-reference/object&PutObject// put.contentType = @"";// put.contentMd5 = @"";// put.contentEncoding = @"";// put.contentDisposition = @"";// put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; // 可以在上传时设置元信息或者其他HTTP头部OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 上传到文件目录OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。 如,在上传文件是,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。注意,路径默认是”根目录”,不需要以’/‘开头。 上传时设置Content-Type和开启校验MD5上传时可以显式指定ContentType,如果没有指定,SDK会根据文件名或者上传的ObjectKey自动判断。另外,上传Object时如果设置了Content-Md5,那么OSS会用之检查消息内容是否与发送时一致。SDK提供了方便的Base64和MD5计算方法。 OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 设置Content-Type,可选put.contentType = @"application/octet-stream";// 设置MD5校验,可选put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // 如果是文件路径// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>]; // 如果是二进制数据// 进度设置,可选put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 追加上传Append Object以追加写的方式上传文件。通过Append Object操作创建的Object类型为Appendable Object,而通过Put Object上传的Object是Normal Object。 OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];// 必填字段append.bucketName = @"<bucketName>";append.objectKey = @"<objectKey>";append.appendPosition = 0; // 指定从何处进行追加NSString * docDir = [self getDocumentDirectory];append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// 可选字段append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考:https://docs.aliyun.com/#/pub/oss/api-reference/object&AppendObject// append.contentType = @"";// append.contentMd5 = @"";// append.contentEncoding = @"";// append.contentDisposition = @"";OSSTask * appendTask = [client appendObject:append];[appendTask continueWithBlock:^id(OSSTask *task) { NSLog(@"objectKey: %@", append.objectKey); if (!task.error) { NSLog(@"append object success!"); OSSAppendObjectResult * result = task.result; NSString * etag = result.eTag; long nextPosition = result.xOssNextAppendPosition; } else { NSLog(@"append object failed, error: %@" , task.error); } return nil;}]; 上传后回调通知客户端在上传Object时可以指定OSS服务端在处理完上传请求后,通知您的业务服务器,在该服务器确认接收了该回调后将回调的结果返回给客户端。因为加入了回调请求和响应的过程,相比简单上传,使用回调通知机制一般会导致客户端花费更多的等待时间。 具体说明参考:Callback 代码示例: OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = @"<bucketName>";request.objectKey = @"<objectKey>";request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];// 设置回调参数request.callbackParam = @{ @"callbackUrl": @"<your server callback address>", @"callbackBody": @"<your callback body>" };// 设置自定义变量request.callbackVar = @{ @"<var1>": @"<value1>", @"<var2>": @"<value2>" };request.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * task = [client putObject:request];[task continueWithBlock:^id(OSSTask *task) { if (task.error) { OSSLogError(@"%@", task.error); } else { OSSPutObjectResult * result = task.result; NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@", result.requestId, result.httpResponseHeaderFields, result.serverReturnJsonString); } return nil;}]; 分片上传因为篇幅的原因,分片上传参考:分片上传 断点续传 特别注意: 断点续传暂时只支持上传本地文件。 对于移动端来说,如果不是比较大的文件,不建议使用这种方式上传,因为断点续传是通过分片上传实现的,上传单个文件需要进行多次网络请求,效率不高。** 在无线网络下,上传比较大的文件持续时间长,可能会遇到因为网络条件差、用户切换网络等原因导致上传中途失败,整个文件需要重新上传。为此,SDK提供了断点上传功能。 在上传前,可以指定断点记录的保存文件夹。若不进行此项设置,断点上传只在本次上传生效,某个分片因为网络原因等上传失败时会进行重试,避免整个大文件重新上传,节省重试时间和耗用流量。如果设置了断点记录的保存文件夹,如果任务失败,在下次重新启动任务,上传同一文件到同一Bucket、Object时,如果用户设置取消时不删除断点记录。再次上传将从断点记录处继续上传。详见随后的范例。 断点续传失败时,如果同一任务一直得不到续传,可能会在OSS上积累无用碎片。对这种情况,可以为Bucket设置lifeCycle规则,定时清理碎片。参考:生命周期管理。 出于碎片管理的原因,如果在断点续传时取消当前任务。默认会同步清理已经上传到服务器的分片。如果取消时需要保留断点上传记录,需要指定断点记录的保存文件夹并修改deleteUploadIdOnCancelling参数。需要注意,如果本地保留记录时间过长,且Bucket设置lifeCycle规则定时清理了服务端分片。会出现服务端和移动端记录不一致的问题。 说明: 断点续传的实现依赖InitMultipartUpload/UploadPart/ListParts/CompleteMultipartUpload/AbortMultipartUpload,如果采用STS鉴权模式,请注意加上这些API所需的权限。 断点续传也支持上传后回调通知,用法和上述普通上传回调通知一致。 断点续传已经默认开启每个分片上传时的Md5校验,请勿重复在request中设置Content-Md5头部。 在本地持久保存断点记录的调用方式(默认是不设置): OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = OSS_BUCKET_PRIVATE;//...NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];resumableUpload.recordDirectoryPath = cachesDir; 断点续传功能实现 // 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = <bucketName>;resumableUpload.objectKey = <objectKey>;resumableUpload.partSize = 1024 * 1024;resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];//设置断点记录文件resumableUpload.recordDirectoryPath = cachesDir;//设置NO,取消时,不删除断点记录文件,如果不进行设置,默认YES,是会删除断点记录文件,下次再进行上传时会重新上传。resumableUpload.deleteUploadIdOnCancelling = NO;resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];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;}];// [resumeTask waitUntilFinished];// [resumableUpload cancel]; 数据完整性校验因为移动端网络环境的复杂性,OSS SDK提供了基于MD5和CRC64的端到端的数据完整性验证功能。 MD5校验 需要在上传文件时提供文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,只有在OSS服务器计算接收到的文件得到的MD5值和上传提供的MD5一致时才可以上传成功,从而保证上传数据的完整性。 OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = BUCKET_NAME;...request.contentMd5 = [OSSUtil fileMD5String:filepath]; CRC校验 与MD5相比,CRC64可以同时上传并计算CRC值。 // 构造上传请求OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = OSS_BUCKET_PRIVATE;///....request.crcFlag = OSSRequestCRCOpen;// 开启crc效验后。如果在传输中数据不一致,会提示OSSClientErrorCodeInvalidCRC 错误。OSSTask * task = [_client putObject:request];[[task continueWithBlock:^id(OSSTask *task) { //如果crc效验失败,会有error XCTAssertNil(task.error); return nil;}] waitUntilFinished];

2019-12-01 23:14:06 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档OSS 移动端SDK 上传文件的方式可以分为:简单上传,追加上传,分片上传和断点续传。 简单上传上传Object可以直接上传OSSData,或者通过NSURL上传一个文件: OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 可选字段,可不设置put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考: https://docs.aliyun.com/#/pub/oss/api-reference/object&PutObject// put.contentType = @"";// put.contentMd5 = @"";// put.contentEncoding = @"";// put.contentDisposition = @"";// put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; // 可以在上传时设置元信息或者其他HTTP头部OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 上传到文件目录OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。 如,在上传文件是,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。注意,路径默认是”根目录”,不需要以’/‘开头。 上传时设置Content-Type和开启校验MD5上传时可以显式指定ContentType,如果没有指定,SDK会根据文件名或者上传的ObjectKey自动判断。另外,上传Object时如果设置了Content-Md5,那么OSS会用之检查消息内容是否与发送时一致。SDK提供了方便的Base64和MD5计算方法。 OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 设置Content-Type,可选put.contentType = @"application/octet-stream";// 设置MD5校验,可选put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // 如果是文件路径// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>]; // 如果是二进制数据// 进度设置,可选put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 追加上传Append Object以追加写的方式上传文件。通过Append Object操作创建的Object类型为Appendable Object,而通过Put Object上传的Object是Normal Object。 OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];// 必填字段append.bucketName = @"<bucketName>";append.objectKey = @"<objectKey>";append.appendPosition = 0; // 指定从何处进行追加NSString * docDir = [self getDocumentDirectory];append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// 可选字段append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考:https://docs.aliyun.com/#/pub/oss/api-reference/object&AppendObject// append.contentType = @"";// append.contentMd5 = @"";// append.contentEncoding = @"";// append.contentDisposition = @"";OSSTask * appendTask = [client appendObject:append];[appendTask continueWithBlock:^id(OSSTask *task) { NSLog(@"objectKey: %@", append.objectKey); if (!task.error) { NSLog(@"append object success!"); OSSAppendObjectResult * result = task.result; NSString * etag = result.eTag; long nextPosition = result.xOssNextAppendPosition; } else { NSLog(@"append object failed, error: %@" , task.error); } return nil;}]; 上传后回调通知客户端在上传Object时可以指定OSS服务端在处理完上传请求后,通知您的业务服务器,在该服务器确认接收了该回调后将回调的结果返回给客户端。因为加入了回调请求和响应的过程,相比简单上传,使用回调通知机制一般会导致客户端花费更多的等待时间。 具体说明参考:Callback 代码示例: OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = @"<bucketName>";request.objectKey = @"<objectKey>";request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];// 设置回调参数request.callbackParam = @{ @"callbackUrl": @"<your server callback address>", @"callbackBody": @"<your callback body>" };// 设置自定义变量request.callbackVar = @{ @"<var1>": @"<value1>", @"<var2>": @"<value2>" };request.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * task = [client putObject:request];[task continueWithBlock:^id(OSSTask *task) { if (task.error) { OSSLogError(@"%@", task.error); } else { OSSPutObjectResult * result = task.result; NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@", result.requestId, result.httpResponseHeaderFields, result.serverReturnJsonString); } return nil;}]; 分片上传因为篇幅的原因,分片上传参考:分片上传 断点续传 特别注意: 断点续传暂时只支持上传本地文件。 对于移动端来说,如果不是比较大的文件,不建议使用这种方式上传,因为断点续传是通过分片上传实现的,上传单个文件需要进行多次网络请求,效率不高。** 在无线网络下,上传比较大的文件持续时间长,可能会遇到因为网络条件差、用户切换网络等原因导致上传中途失败,整个文件需要重新上传。为此,SDK提供了断点上传功能。 在上传前,可以指定断点记录的保存文件夹。若不进行此项设置,断点上传只在本次上传生效,某个分片因为网络原因等上传失败时会进行重试,避免整个大文件重新上传,节省重试时间和耗用流量。如果设置了断点记录的保存文件夹,如果任务失败,在下次重新启动任务,上传同一文件到同一Bucket、Object时,如果用户设置取消时不删除断点记录。再次上传将从断点记录处继续上传。详见随后的范例。 断点续传失败时,如果同一任务一直得不到续传,可能会在OSS上积累无用碎片。对这种情况,可以为Bucket设置lifeCycle规则,定时清理碎片。参考:生命周期管理。 出于碎片管理的原因,如果在断点续传时取消当前任务。默认会同步清理已经上传到服务器的分片。如果取消时需要保留断点上传记录,需要指定断点记录的保存文件夹并修改deleteUploadIdOnCancelling参数。需要注意,如果本地保留记录时间过长,且Bucket设置lifeCycle规则定时清理了服务端分片。会出现服务端和移动端记录不一致的问题。 说明: 断点续传的实现依赖InitMultipartUpload/UploadPart/ListParts/CompleteMultipartUpload/AbortMultipartUpload,如果采用STS鉴权模式,请注意加上这些API所需的权限。 断点续传也支持上传后回调通知,用法和上述普通上传回调通知一致。 断点续传已经默认开启每个分片上传时的Md5校验,请勿重复在request中设置Content-Md5头部。 在本地持久保存断点记录的调用方式(默认是不设置): OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = OSS_BUCKET_PRIVATE;//...NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];resumableUpload.recordDirectoryPath = cachesDir; 断点续传功能实现 // 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = <bucketName>;resumableUpload.objectKey = <objectKey>;resumableUpload.partSize = 1024 * 1024;resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];//设置断点记录文件resumableUpload.recordDirectoryPath = cachesDir;//设置NO,取消时,不删除断点记录文件,如果不进行设置,默认YES,是会删除断点记录文件,下次再进行上传时会重新上传。resumableUpload.deleteUploadIdOnCancelling = NO;resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];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;}];// [resumeTask waitUntilFinished];// [resumableUpload cancel]; 数据完整性校验因为移动端网络环境的复杂性,OSS SDK提供了基于MD5和CRC64的端到端的数据完整性验证功能。 MD5校验 需要在上传文件时提供文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,只有在OSS服务器计算接收到的文件得到的MD5值和上传提供的MD5一致时才可以上传成功,从而保证上传数据的完整性。 OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = BUCKET_NAME;...request.contentMd5 = [OSSUtil fileMD5String:filepath]; CRC校验 与MD5相比,CRC64可以同时上传并计算CRC值。 // 构造上传请求OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = OSS_BUCKET_PRIVATE;///....request.crcFlag = OSSRequestCRCOpen;// 开启crc效验后。如果在传输中数据不一致,会提示OSSClientErrorCodeInvalidCRC 错误。OSSTask * task = [_client putObject:request];[[task continueWithBlock:^id(OSSTask *task) { //如果crc效验失败,会有error XCTAssertNil(task.error); return nil;}] waitUntilFinished];

2019-12-01 23:14:07 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档OSS 移动端SDK 上传文件的方式可以分为:简单上传,追加上传,分片上传和断点续传。 简单上传上传Object可以直接上传OSSData,或者通过NSURL上传一个文件: OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 可选字段,可不设置put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考: https://docs.aliyun.com/#/pub/oss/api-reference/object&PutObject// put.contentType = @"";// put.contentMd5 = @"";// put.contentEncoding = @"";// put.contentDisposition = @"";// put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; // 可以在上传时设置元信息或者其他HTTP头部OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 上传到文件目录OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。 如,在上传文件是,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。注意,路径默认是”根目录”,不需要以’/‘开头。 上传时设置Content-Type和开启校验MD5上传时可以显式指定ContentType,如果没有指定,SDK会根据文件名或者上传的ObjectKey自动判断。另外,上传Object时如果设置了Content-Md5,那么OSS会用之检查消息内容是否与发送时一致。SDK提供了方便的Base64和MD5计算方法。 OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 设置Content-Type,可选put.contentType = @"application/octet-stream";// 设置MD5校验,可选put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // 如果是文件路径// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>]; // 如果是二进制数据// 进度设置,可选put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 追加上传Append Object以追加写的方式上传文件。通过Append Object操作创建的Object类型为Appendable Object,而通过Put Object上传的Object是Normal Object。 OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];// 必填字段append.bucketName = @"<bucketName>";append.objectKey = @"<objectKey>";append.appendPosition = 0; // 指定从何处进行追加NSString * docDir = [self getDocumentDirectory];append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// 可选字段append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考:https://docs.aliyun.com/#/pub/oss/api-reference/object&AppendObject// append.contentType = @"";// append.contentMd5 = @"";// append.contentEncoding = @"";// append.contentDisposition = @"";OSSTask * appendTask = [client appendObject:append];[appendTask continueWithBlock:^id(OSSTask *task) { NSLog(@"objectKey: %@", append.objectKey); if (!task.error) { NSLog(@"append object success!"); OSSAppendObjectResult * result = task.result; NSString * etag = result.eTag; long nextPosition = result.xOssNextAppendPosition; } else { NSLog(@"append object failed, error: %@" , task.error); } return nil;}]; 上传后回调通知客户端在上传Object时可以指定OSS服务端在处理完上传请求后,通知您的业务服务器,在该服务器确认接收了该回调后将回调的结果返回给客户端。因为加入了回调请求和响应的过程,相比简单上传,使用回调通知机制一般会导致客户端花费更多的等待时间。 具体说明参考:Callback 代码示例: OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = @"<bucketName>";request.objectKey = @"<objectKey>";request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];// 设置回调参数request.callbackParam = @{ @"callbackUrl": @"<your server callback address>", @"callbackBody": @"<your callback body>" };// 设置自定义变量request.callbackVar = @{ @"<var1>": @"<value1>", @"<var2>": @"<value2>" };request.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * task = [client putObject:request];[task continueWithBlock:^id(OSSTask *task) { if (task.error) { OSSLogError(@"%@", task.error); } else { OSSPutObjectResult * result = task.result; NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@", result.requestId, result.httpResponseHeaderFields, result.serverReturnJsonString); } return nil;}]; 分片上传因为篇幅的原因,分片上传参考:分片上传 断点续传 特别注意: 断点续传暂时只支持上传本地文件。 对于移动端来说,如果不是比较大的文件,不建议使用这种方式上传,因为断点续传是通过分片上传实现的,上传单个文件需要进行多次网络请求,效率不高。** 在无线网络下,上传比较大的文件持续时间长,可能会遇到因为网络条件差、用户切换网络等原因导致上传中途失败,整个文件需要重新上传。为此,SDK提供了断点上传功能。 在上传前,可以指定断点记录的保存文件夹。若不进行此项设置,断点上传只在本次上传生效,某个分片因为网络原因等上传失败时会进行重试,避免整个大文件重新上传,节省重试时间和耗用流量。如果设置了断点记录的保存文件夹,如果任务失败,在下次重新启动任务,上传同一文件到同一Bucket、Object时,如果用户设置取消时不删除断点记录。再次上传将从断点记录处继续上传。详见随后的范例。 断点续传失败时,如果同一任务一直得不到续传,可能会在OSS上积累无用碎片。对这种情况,可以为Bucket设置lifeCycle规则,定时清理碎片。参考:生命周期管理。 出于碎片管理的原因,如果在断点续传时取消当前任务。默认会同步清理已经上传到服务器的分片。如果取消时需要保留断点上传记录,需要指定断点记录的保存文件夹并修改deleteUploadIdOnCancelling参数。需要注意,如果本地保留记录时间过长,且Bucket设置lifeCycle规则定时清理了服务端分片。会出现服务端和移动端记录不一致的问题。 说明: 断点续传的实现依赖InitMultipartUpload/UploadPart/ListParts/CompleteMultipartUpload/AbortMultipartUpload,如果采用STS鉴权模式,请注意加上这些API所需的权限。 断点续传也支持上传后回调通知,用法和上述普通上传回调通知一致。 断点续传已经默认开启每个分片上传时的Md5校验,请勿重复在request中设置Content-Md5头部。 在本地持久保存断点记录的调用方式(默认是不设置): OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = OSS_BUCKET_PRIVATE;//...NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];resumableUpload.recordDirectoryPath = cachesDir; 断点续传功能实现 // 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = <bucketName>;resumableUpload.objectKey = <objectKey>;resumableUpload.partSize = 1024 * 1024;resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];//设置断点记录文件resumableUpload.recordDirectoryPath = cachesDir;//设置NO,取消时,不删除断点记录文件,如果不进行设置,默认YES,是会删除断点记录文件,下次再进行上传时会重新上传。resumableUpload.deleteUploadIdOnCancelling = NO;resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];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;}];// [resumeTask waitUntilFinished];// [resumableUpload cancel]; 数据完整性校验因为移动端网络环境的复杂性,OSS SDK提供了基于MD5和CRC64的端到端的数据完整性验证功能。 MD5校验 需要在上传文件时提供文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,只有在OSS服务器计算接收到的文件得到的MD5值和上传提供的MD5一致时才可以上传成功,从而保证上传数据的完整性。 OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = BUCKET_NAME;...request.contentMd5 = [OSSUtil fileMD5String:filepath]; CRC校验 与MD5相比,CRC64可以同时上传并计算CRC值。 // 构造上传请求OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = OSS_BUCKET_PRIVATE;///....request.crcFlag = OSSRequestCRCOpen;// 开启crc效验后。如果在传输中数据不一致,会提示OSSClientErrorCodeInvalidCRC 错误。OSSTask * task = [_client putObject:request];[[task continueWithBlock:^id(OSSTask *task) { //如果crc效验失败,会有error XCTAssertNil(task.error); return nil;}] waitUntilFinished];

2019-12-01 23:14:09 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档OSS 移动端SDK 上传文件的方式可以分为:简单上传,追加上传,分片上传和断点续传。 简单上传上传Object可以直接上传OSSData,或者通过NSURL上传一个文件: OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 可选字段,可不设置put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考: https://docs.aliyun.com/#/pub/oss/api-reference/object&PutObject// put.contentType = @"";// put.contentMd5 = @"";// put.contentEncoding = @"";// put.contentDisposition = @"";// put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; // 可以在上传时设置元信息或者其他HTTP头部OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 上传到文件目录OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。 如,在上传文件是,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。注意,路径默认是”根目录”,不需要以’/‘开头。 上传时设置Content-Type和开启校验MD5上传时可以显式指定ContentType,如果没有指定,SDK会根据文件名或者上传的ObjectKey自动判断。另外,上传Object时如果设置了Content-Md5,那么OSS会用之检查消息内容是否与发送时一致。SDK提供了方便的Base64和MD5计算方法。 OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 设置Content-Type,可选put.contentType = @"application/octet-stream";// 设置MD5校验,可选put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // 如果是文件路径// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>]; // 如果是二进制数据// 进度设置,可选put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 追加上传Append Object以追加写的方式上传文件。通过Append Object操作创建的Object类型为Appendable Object,而通过Put Object上传的Object是Normal Object。 OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];// 必填字段append.bucketName = @"<bucketName>";append.objectKey = @"<objectKey>";append.appendPosition = 0; // 指定从何处进行追加NSString * docDir = [self getDocumentDirectory];append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// 可选字段append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考:https://docs.aliyun.com/#/pub/oss/api-reference/object&AppendObject// append.contentType = @"";// append.contentMd5 = @"";// append.contentEncoding = @"";// append.contentDisposition = @"";OSSTask * appendTask = [client appendObject:append];[appendTask continueWithBlock:^id(OSSTask *task) { NSLog(@"objectKey: %@", append.objectKey); if (!task.error) { NSLog(@"append object success!"); OSSAppendObjectResult * result = task.result; NSString * etag = result.eTag; long nextPosition = result.xOssNextAppendPosition; } else { NSLog(@"append object failed, error: %@" , task.error); } return nil;}]; 上传后回调通知客户端在上传Object时可以指定OSS服务端在处理完上传请求后,通知您的业务服务器,在该服务器确认接收了该回调后将回调的结果返回给客户端。因为加入了回调请求和响应的过程,相比简单上传,使用回调通知机制一般会导致客户端花费更多的等待时间。 具体说明参考:Callback 代码示例: OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = @"<bucketName>";request.objectKey = @"<objectKey>";request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];// 设置回调参数request.callbackParam = @{ @"callbackUrl": @"<your server callback address>", @"callbackBody": @"<your callback body>" };// 设置自定义变量request.callbackVar = @{ @"<var1>": @"<value1>", @"<var2>": @"<value2>" };request.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * task = [client putObject:request];[task continueWithBlock:^id(OSSTask *task) { if (task.error) { OSSLogError(@"%@", task.error); } else { OSSPutObjectResult * result = task.result; NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@", result.requestId, result.httpResponseHeaderFields, result.serverReturnJsonString); } return nil;}]; 分片上传因为篇幅的原因,分片上传参考:分片上传 断点续传 特别注意: 断点续传暂时只支持上传本地文件。 对于移动端来说,如果不是比较大的文件,不建议使用这种方式上传,因为断点续传是通过分片上传实现的,上传单个文件需要进行多次网络请求,效率不高。** 在无线网络下,上传比较大的文件持续时间长,可能会遇到因为网络条件差、用户切换网络等原因导致上传中途失败,整个文件需要重新上传。为此,SDK提供了断点上传功能。 在上传前,可以指定断点记录的保存文件夹。若不进行此项设置,断点上传只在本次上传生效,某个分片因为网络原因等上传失败时会进行重试,避免整个大文件重新上传,节省重试时间和耗用流量。如果设置了断点记录的保存文件夹,如果任务失败,在下次重新启动任务,上传同一文件到同一Bucket、Object时,如果用户设置取消时不删除断点记录。再次上传将从断点记录处继续上传。详见随后的范例。 断点续传失败时,如果同一任务一直得不到续传,可能会在OSS上积累无用碎片。对这种情况,可以为Bucket设置lifeCycle规则,定时清理碎片。参考:生命周期管理。 出于碎片管理的原因,如果在断点续传时取消当前任务。默认会同步清理已经上传到服务器的分片。如果取消时需要保留断点上传记录,需要指定断点记录的保存文件夹并修改deleteUploadIdOnCancelling参数。需要注意,如果本地保留记录时间过长,且Bucket设置lifeCycle规则定时清理了服务端分片。会出现服务端和移动端记录不一致的问题。 说明: 断点续传的实现依赖InitMultipartUpload/UploadPart/ListParts/CompleteMultipartUpload/AbortMultipartUpload,如果采用STS鉴权模式,请注意加上这些API所需的权限。 断点续传也支持上传后回调通知,用法和上述普通上传回调通知一致。 断点续传已经默认开启每个分片上传时的Md5校验,请勿重复在request中设置Content-Md5头部。 在本地持久保存断点记录的调用方式(默认是不设置): OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = OSS_BUCKET_PRIVATE;//...NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];resumableUpload.recordDirectoryPath = cachesDir; 断点续传功能实现 // 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = <bucketName>;resumableUpload.objectKey = <objectKey>;resumableUpload.partSize = 1024 * 1024;resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];//设置断点记录文件resumableUpload.recordDirectoryPath = cachesDir;//设置NO,取消时,不删除断点记录文件,如果不进行设置,默认YES,是会删除断点记录文件,下次再进行上传时会重新上传。resumableUpload.deleteUploadIdOnCancelling = NO;resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];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;}];// [resumeTask waitUntilFinished];// [resumableUpload cancel]; 数据完整性校验因为移动端网络环境的复杂性,OSS SDK提供了基于MD5和CRC64的端到端的数据完整性验证功能。 MD5校验 需要在上传文件时提供文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,只有在OSS服务器计算接收到的文件得到的MD5值和上传提供的MD5一致时才可以上传成功,从而保证上传数据的完整性。 OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = BUCKET_NAME;...request.contentMd5 = [OSSUtil fileMD5String:filepath]; CRC校验 与MD5相比,CRC64可以同时上传并计算CRC值。 // 构造上传请求OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = OSS_BUCKET_PRIVATE;///....request.crcFlag = OSSRequestCRCOpen;// 开启crc效验后。如果在传输中数据不一致,会提示OSSClientErrorCodeInvalidCRC 错误。OSSTask * task = [_client putObject:request];[[task continueWithBlock:^id(OSSTask *task) { //如果crc效验失败,会有error XCTAssertNil(task.error); return nil;}] waitUntilFinished];

2019-12-01 23:14:08 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档OSS 移动端SDK 上传文件的方式可以分为:简单上传,追加上传,分片上传和断点续传。 简单上传上传Object可以直接上传OSSData,或者通过NSURL上传一个文件: OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 可选字段,可不设置put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考: https://docs.aliyun.com/#/pub/oss/api-reference/object&PutObject// put.contentType = @"";// put.contentMd5 = @"";// put.contentEncoding = @"";// put.contentDisposition = @"";// put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; // 可以在上传时设置元信息或者其他HTTP头部OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 上传到文件目录OSS服务是没有文件夹这个概念的,所有元素都是以文件来存储,但给用户提供了创建模拟文件夹的方式。创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件,对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。 如,在上传文件是,如果把ObjectKey写为"folder/subfolder/file",即是模拟了把文件上传到folder/subfolder/下的file文件。注意,路径默认是”根目录”,不需要以’/‘开头。 上传时设置Content-Type和开启校验MD5上传时可以显式指定ContentType,如果没有指定,SDK会根据文件名或者上传的ObjectKey自动判断。另外,上传Object时如果设置了Content-Md5,那么OSS会用之检查消息内容是否与发送时一致。SDK提供了方便的Base64和MD5计算方法。 OSSPutObjectRequest * put = [OSSPutObjectRequest new];// 必填字段put.bucketName = @"<bucketName>";put.objectKey = @"<objectKey>";put.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// put.uploadingData = <NSData *>; // 直接上传NSData// 设置Content-Type,可选put.contentType = @"application/octet-stream";// 设置MD5校验,可选put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // 如果是文件路径// put.contentMd5 = [OSSUtil base64Md5ForData:<NSData *>]; // 如果是二进制数据// 进度设置,可选put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度 NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * putTask = [client putObject:put];[putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil;}];// [putTask waitUntilFinished];// [put cancel]; 追加上传Append Object以追加写的方式上传文件。通过Append Object操作创建的Object类型为Appendable Object,而通过Put Object上传的Object是Normal Object。 OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];// 必填字段append.bucketName = @"<bucketName>";append.objectKey = @"<objectKey>";append.appendPosition = 0; // 指定从何处进行追加NSString * docDir = [self getDocumentDirectory];append.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];// 可选字段append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};// 以下可选字段的含义参考:https://docs.aliyun.com/#/pub/oss/api-reference/object&AppendObject// append.contentType = @"";// append.contentMd5 = @"";// append.contentEncoding = @"";// append.contentDisposition = @"";OSSTask * appendTask = [client appendObject:append];[appendTask continueWithBlock:^id(OSSTask *task) { NSLog(@"objectKey: %@", append.objectKey); if (!task.error) { NSLog(@"append object success!"); OSSAppendObjectResult * result = task.result; NSString * etag = result.eTag; long nextPosition = result.xOssNextAppendPosition; } else { NSLog(@"append object failed, error: %@" , task.error); } return nil;}]; 上传后回调通知客户端在上传Object时可以指定OSS服务端在处理完上传请求后,通知您的业务服务器,在该服务器确认接收了该回调后将回调的结果返回给客户端。因为加入了回调请求和响应的过程,相比简单上传,使用回调通知机制一般会导致客户端花费更多的等待时间。 具体说明参考:Callback 代码示例: OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = @"<bucketName>";request.objectKey = @"<objectKey>";request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];// 设置回调参数request.callbackParam = @{ @"callbackUrl": @"<your server callback address>", @"callbackBody": @"<your callback body>" };// 设置自定义变量request.callbackVar = @{ @"<var1>": @"<value1>", @"<var2>": @"<value2>" };request.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};OSSTask * task = [client putObject:request];[task continueWithBlock:^id(OSSTask *task) { if (task.error) { OSSLogError(@"%@", task.error); } else { OSSPutObjectResult * result = task.result; NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@", result.requestId, result.httpResponseHeaderFields, result.serverReturnJsonString); } return nil;}]; 分片上传因为篇幅的原因,分片上传参考:分片上传 断点续传 特别注意: 断点续传暂时只支持上传本地文件。 对于移动端来说,如果不是比较大的文件,不建议使用这种方式上传,因为断点续传是通过分片上传实现的,上传单个文件需要进行多次网络请求,效率不高。** 在无线网络下,上传比较大的文件持续时间长,可能会遇到因为网络条件差、用户切换网络等原因导致上传中途失败,整个文件需要重新上传。为此,SDK提供了断点上传功能。 在上传前,可以指定断点记录的保存文件夹。若不进行此项设置,断点上传只在本次上传生效,某个分片因为网络原因等上传失败时会进行重试,避免整个大文件重新上传,节省重试时间和耗用流量。如果设置了断点记录的保存文件夹,如果任务失败,在下次重新启动任务,上传同一文件到同一Bucket、Object时,如果用户设置取消时不删除断点记录。再次上传将从断点记录处继续上传。详见随后的范例。 断点续传失败时,如果同一任务一直得不到续传,可能会在OSS上积累无用碎片。对这种情况,可以为Bucket设置lifeCycle规则,定时清理碎片。参考:生命周期管理。 出于碎片管理的原因,如果在断点续传时取消当前任务。默认会同步清理已经上传到服务器的分片。如果取消时需要保留断点上传记录,需要指定断点记录的保存文件夹并修改deleteUploadIdOnCancelling参数。需要注意,如果本地保留记录时间过长,且Bucket设置lifeCycle规则定时清理了服务端分片。会出现服务端和移动端记录不一致的问题。 说明: 断点续传的实现依赖InitMultipartUpload/UploadPart/ListParts/CompleteMultipartUpload/AbortMultipartUpload,如果采用STS鉴权模式,请注意加上这些API所需的权限。 断点续传也支持上传后回调通知,用法和上述普通上传回调通知一致。 断点续传已经默认开启每个分片上传时的Md5校验,请勿重复在request中设置Content-Md5头部。 在本地持久保存断点记录的调用方式(默认是不设置): OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = OSS_BUCKET_PRIVATE;//...NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];resumableUpload.recordDirectoryPath = cachesDir; 断点续传功能实现 // 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = <bucketName>;resumableUpload.objectKey = <objectKey>;resumableUpload.partSize = 1024 * 1024;resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];//设置断点记录文件resumableUpload.recordDirectoryPath = cachesDir;//设置NO,取消时,不删除断点记录文件,如果不进行设置,默认YES,是会删除断点记录文件,下次再进行上传时会重新上传。resumableUpload.deleteUploadIdOnCancelling = NO;resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];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;}];// [resumeTask waitUntilFinished];// [resumableUpload cancel]; 数据完整性校验因为移动端网络环境的复杂性,OSS SDK提供了基于MD5和CRC64的端到端的数据完整性验证功能。 MD5校验 需要在上传文件时提供文件的Content-MD5值,OSS服务器会帮助用户进行MD5校验,只有在OSS服务器计算接收到的文件得到的MD5值和上传提供的MD5一致时才可以上传成功,从而保证上传数据的完整性。 OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = BUCKET_NAME;...request.contentMd5 = [OSSUtil fileMD5String:filepath]; CRC校验 与MD5相比,CRC64可以同时上传并计算CRC值。 // 构造上传请求OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = OSS_BUCKET_PRIVATE;///....request.crcFlag = OSSRequestCRCOpen;// 开启crc效验后。如果在传输中数据不一致,会提示OSSClientErrorCodeInvalidCRC 错误。OSSTask * task = [_client putObject:request];[[task continueWithBlock:^id(OSSTask *task) { //如果crc效验失败,会有error XCTAssertNil(task.error); return nil;}] waitUntilFinished];

2019-12-01 23:14:08 0 浏览量 回答数 0

问题

高级接口的使用

云栖大讲堂 2019-12-01 21:08:59 1628 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站