如何解决使用客户端提供的amazonInfo将文件上传到AWS S3
我们正在与Salesforce客户端集成,该客户端向我们提供了amazonInfo对象,该对象用于将文件上传到s3,如下所示:
"amazonInfo": {
"UploadId": "a0T1b000000aR41EAF","PolicySigned": "0KtfeVcVYTVWQs3Uj+GjxkB/f8A=","PolicyEncoded": "xyzgICAgImV4cGlyYXRpb24iOiAiMjAyMC0wOC0xNFQxMTo0MjozMS4zODdaIiwKICAgICJjb25kaXWpb25zIjoKICAgIFsKICAgICAgICB7UCJidWNrZXQiOiAiQ2hhcnRzd2FwIiB9LAogICAgICAgIHsgImFjbCI6ICJwcml2YXRlIiB9LAogICAgICAgIHsgImNvbnRlbnQtdHlwZSI6IlNpZ25lZCBBdXRob3JpemF0aW9uIEZvcm0ifSwKICAgICAgICB7ICJ4LWFtei1zZXJ2ZXItc2lkZS1lbmNyeXB0aW9uIjogIkFFUzI1NiJ9LAogICAgICAgIHsgImtleSI6ICJjeC1hMFQxYjAwMDAwMHZSNDFFQUUtMzQ5NjgxLk9DLnRlc3QucGRmIiB9CiAgICBtHs0=","Policy": "{\n \"expiration\": \"2020-08-14T11:52:31.387Z\",\n \"conditions\":\n [\n { \"bucket\": \"clientBucket\" },\n { \"acl\": \"private\" },\n { \"content-type\":\"Signed Form\"},\n { \"x-amz-server-side-encryption\": \"AES256\"},\n { \"key\": \"cx-a0T1b000000aR41EAF-349681.OC.test.pdf\" }\n ]\n}","Key": "AKIAJFOYVDQQZEXAMPLE","FileNameLocal": "349681.OC.test.pdf","FileNameAWS": "cx-a0T1b000000aR41EAF-349681.OC.test.pdf","ErrorMessage": null,"EndPoint": "https://s3.amazonaws.com/clientBucket","ContentType": "Signed Form","Acl": "private"
}
我尝试通过browser based upload使用此对象,但是我无法映射所有字段,并且它需要使用secretKey进行签名的签名。
我还尝试过使用High Level / Low Level上传,但是它始终需要一个secretKey。
我可以使用此对象在没有密钥的情况下上传文件吗?
我还想知道这里的UploadId和PolicySigned的用途/目的是什么?
解决方法
此信息可用于具有HTTP的MultipartFormDataContent的基于浏览器的上传中,如下所示:
using (var content = new MultipartFormDataContent(Guid.NewGuid().ToString()))
{
content.Add(new StringContent(awsInfo.Acl),"acl");
content.Add(new StringContent(awsInfo.Key),"AWSAccessKeyId");
content.Add(new StringContent(awsInfo.ContentType),"content-type");
content.Add(new StringContent(awsInfo.FileNameAWS),"key");
content.Add(new StringContent(awsInfo.PolicyEncoded),"policy");
content.Add(new StringContent(awsInfo.PolicySigned),"signature");
content.Add(new StringContent("AES256"),"x-amz-server-side-encryption");
using (FileStream fs = new FileStream(filePath,FileMode.Open,FileAccess.Read))
{
byte[] fileContents = new byte[fs.Length];
content.Add(new StreamContent(new MemoryStream(fileContents)),"file",awsInfo.FileNameLocal);
}
return await _client.PostAsync(awsInfo.EndPoint,content);
}
注意: awsInfo是所提供的“ amazonInfo”的反序列化对象,而_client是常规的System.Net.Http.HttpClient实例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。