#c# #amazon-web-services #amazon-s3 #.net-core #salesforce
#c# #amazon-веб-сервисы #amazon-s3 #.net-ядро #salesforce
Вопрос:
Мы интегрируемся с клиентом 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"
}
Я пытался использовать этот объект с помощью загрузки через браузер, но я не могу сопоставить все поля, и для подписи требуется подпись, использующая секретный ключ.
Я также пытался использовать загрузку высокого / низкого уровня, но для этого всегда требуется секретный ключ.
Могу ли я использовать этот объект для загрузки файла без секретного ключа?
Мне также было интересно, для чего здесь используются UploadId и PolicySigned?
Ответ №1:
Эта информация может быть использована при загрузке через браузер с использованием HTTP Post с 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.