本文介绍如何从内存中上传文件或者上传本地文件。您也可以使用MD5校验来确保上传过程中的数据完整性。
注意事项
使用本文示例前您需要先通过自定义域名、STS等方式新建OSSClient,具体请参见初始化。
说明所创建存储空间的所属地域取决于初始化配置的endpoint地域信息。
要上传文件,您必须有
oss:PutObject
权限。具体操作,请参见为RAM用户授权自定义的权限策略。
从内存中上传文件或上传本地文件
上传文件时可以直接上传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";
// 设置Content-MD5。
// put.contentMd5 = @"eB5eJF1ptWaXm4bijSPyxw==";
// 设置Object的编码方式。
// put.contentEncoding = @"identity";
// 设置Object的展示形式。
// put.contentDisposition = @"attachment";
// 可以在上传文件时设置文件元数据或者HTTP头部。
// NSMutableDictionary *meta = [NSMutableDictionary dictionary];
// 设置文件元数据。
// [meta setObject:@"value" forKey:@"x-oss-meta-name1"];
// 设置Object的访问权限为私有。
// [meta setObject:@"private" forKey:@"x-oss-object-acl"];
// 设置Object的归档类型为标准存储。
// [meta setObject:@"Standard" forKey:@"x-oss-storage-class"];
// 设置覆盖同名目标Object。
// [meta setObject:@"true" forKey:@"x-oss-forbid-overwrite"];
// 指定Object的对象标签,可同时设置多个标签。
// [meta setObject:@"a:1" forKey:@"x-oss-tagging"];
// 指定OSS创建目标Object时使用的服务器端加密算法。
// [meta setObject:@"AES256" forKey:@"x-oss-server-side-encryption"];
// 表示KMS托管的用户主密钥,该参数仅在x-oss-server-side-encryption为KMS时有效。
// [meta setObject:@"9468da86-3509-4f8d-a61e-6eab1eac****" forKey:@"x-oss-server-side-encryption-key-id"];
// put.objectMeta = meta;
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;
}];
// waitUntilFinished会阻塞当前线程,但是不会阻塞上传任务进程。
// [putTask waitUntilFinished];
// [put cancel];
上传到文件目录
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>"];
// 直接上传NSData。
// put.uploadingData = <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;
}];
// waitUntilFinished会阻塞当前线程,但是不会阻塞上传任务进程。
// [putTask waitUntilFinished];
// [put cancel];
相关文档
关于简单上传的完整示例代码,请参见GitHub示例。
关于简单上传的API接口说明,请参见PutObject。
关于初始化OSSClient,请参见如何初始化OSSClient实例。