本文介绍如何从内存中上传文件或者上传本地文件。您也可以使用MD5校验来确保上传过程中的数据完整性。
从内存中上传文件或上传本地文件
上传文件时可以直接上传OSSData或者通过NSURL上传文件。
OSSPutObjectRequest * put = [OSSPutObjectRequest new]; // 填写Bucket名称,例如examplebucket。 put.bucketName = @"examplebucket"; // 填写文件完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。 put.objectKey = @"exampledir/exampleobject.txt"; 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); }; // 配置可选字段。 // put.contentType = @"application/octet-stream"; // put.contentMd5 = @""; // put.contentEncoding = @""; // put.contentDisposition = @""; // 可以在上传文件时设置文件元数据或者HTTP头部。 // put.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil]; 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];
关于contentType、contentMd5、contentEncoding、contentDisposition、objectMeta等可选参数的含义,请参见PutObject。
上传到文件目录
OSS没有文件夹的概念,所有元素都是以文件来存储。OSS提供了创建模拟文件夹的方式。创建模拟文件夹本质上是创建了一个名称以正斜线(/)结尾的文件以实现将文件上传至目录,控制台会对以正斜线(/)结尾的文件以文件夹的方式展示。
例如上传文件时,如果把objectKey设置为
folder/subfolder/file
,表示将file文件上传到
folder/subfolder/
目录下。
说明 路径默认是根目录,不需要以正斜线 (/)开头。
上传文件时设置contentType并带有MD5校验
为保证客户端发送的数据和OSS服务端接收到的数据一致,您可以在上传文件时增加contentMd5值,OSS服务端会使用该MD5值做校验。上传文件时还可以显式指定contentType,如果未显式指定contentType,则SDK会根据文件名或者上传的objectKey自行判断。
注意 使用MD5校验时,性能会有所下降。
SDK提供了便捷的Base64和contentMd5的计算方法。
OSSPutObjectRequest * put = [OSSPutObjectRequest new]; // 填写Bucket名称,例如examplebucket。 put.bucketName = @"examplebucket"; // 填写文件完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。 put.objectKey = @"exampledir/exampleobject.txt"; put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"]; // put.uploadingData = <NSData *>; // 直接上传NSData。 // (可选)设置contentType。 put.contentType = @"application/octet-stream"; // (可选)设置contentMd5校验。 // 设置文件路径的contentMd5校验。 put.contentMd5 = [OSSUtil base64Md5ForFilePath:@"<filePath>"]; // 设置二进制数据的contentMd5校验。 // 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];