【发布时间】:2014-10-15 14:46:44
【问题描述】:
我正在尝试使用适用于 iOS 2.0 的新 AWS 开发工具包将文件上传到 S3。 只要我不在请求中设置 contentMD5,上传就可以正常工作。
首先,我创建一个文件路径和一个 URL:
NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"s3tmp"];
NSURL *tempFileURL = [NSURL fileURLWithPath:tempFilePath];
接下来,我创建请求:
AWSS3TransferManagerUploadRequest *uploadRequest = [AWSS3TransferManagerUploadRequest new];
uploadRequest.bucket = S3_BUCKETNAME;
uploadRequest.key = s3Key;
uploadRequest.body = tempFileURL;
然后我创建 md5。方便,这里有个github项目:https://github.com/JoeKun/FileMD5Hash 这是从文件创建md5。但是,我用 bashs md5 进行了交叉检查,它返回了相同的 md5 字符串。此外,如果我没有在请求中设置 contentMD5,则上传成功,并且在控制台中,相同的 md5 字符串显示为 eTag。所以我认为下一行计算的md5是正确的。
NSString *md5 = [FileHash md5HashOfFileAtPath:tempFilePath];
最后,我将 md5 添加到 uploadRequest 中:
uploadRequest.contentMD5 = md5;
并开始上传:
[[transferManager upload:uploadRequest] continueWithBlock:^id(BFTask *task) {
NSError *error = task.error;
if (error) {
NSDictionary *errorUserInfo = error.userInfo;
NSLog(@"Error %@: %@",[errorUserInfo objectForKey:@"Code"],[errorUserInfo objectForKey:@"Message"]);
dispatch_sync(dispatch_get_main_queue(), ^{
[weakSelf uploadFinishedUnsuccessful];
});
}
else {
NSLog(@"Upload success for file \n%@ to \n%@/%@",[tempFileURL absoluteString],S3_BUCKETNAME,s3Key);
dispatch_sync(dispatch_get_main_queue(), ^{
[weakSelf uploadFinishedSuccessful];
});
}
return nil;
}];
这总是返回一个错误: 错误 InvalidDigest:您指定的 Content-MD5 无效。
所以我尝试使用iOS的内置方法将md5包装成base64:
NSString *base64EncodedString = [[md5 dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];
我与另一个 base64 库交叉检查了这个。它返回相同的base64字符串,所以我认为base64字符串是正确的。我尝试将其设置为 contentMD5:
uploadRequest.contentMD5 = base64EncodedString;
我得到同样的错误: 错误 InvalidDigest:您指定的 Content-MD5 无效。
知道我做错了什么吗?
感谢您的回复!
【问题讨论】:
标签: ios amazon-web-services amazon-s3