本文介绍如何从内存中上传、上传本地文件以及上传文件时开启MD5数据校验等。

从内存中上传或上传本地文件

上传文件时可以直接上传OSSData,或者通过NSURL上传文件:

OSSPutObjectRequest * put = [OSSPutObjectRequest new];
// 配置必填字段,其中bucketName为存储空间名称;objectKey等同于objectName,表示将文件上传到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
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);
};
// 配置可选字段。
// put.contentType = @"";
// 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并开启校验contentMd5

上传文件时可以显式指定contentType。如果没有显式指定contentType,SDK会根据文件名或者上传的ObjectKey自行判断。另外,上传文件时如果设置了contentMd5,则OSS会用contentMd5来检查消息内容是否与发送时一致。此外,SDK提供了便捷的Base64和contentMd5的计算方法。

OSSPutObjectRequest * put = [OSSPutObjectRequest new];
// 配置必填字段。
put.bucketName = @"<bucketName>";
put.objectKey = @"<objectKey>";
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];