我将尝试使用新的AWS SDK for iOS 2.0上传文件到S3。只要我不在请求中设置contentMD5,上传就可以正常工作。
首先,我创建了一个文件路径和一个URL:
最后,我将md5添加到uploadRequest中:
我遇到了相同的错误: 错误代码 InvalidDigest:您指定的 Content-MD5 无效。 不知道我做错了什么? 感谢您的回复!
首先,我创建了一个文件路径和一个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。然而,我使用bash的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;
}];
这总是返回错误:
Error InvalidDigest: 指定的Content-MD5无效。
所以我尝试将md5包装成base64,使用iOS的内置方法:
NSString *base64EncodedString = [[md5 dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];
我用另一个base64库进行了交叉检查。它返回相同的base64字符串,所以我认为这个base64字符串是正确的。我尝试将其设置为contentMD5:
uploadRequest.contentMD5 = base64EncodedString;
我遇到了相同的错误: 错误代码 InvalidDigest:您指定的 Content-MD5 无效。 不知道我做错了什么? 感谢您的回复!