Загрузить файл в AWS S3 с использованием amazonInfo, предоставленного клиентом

#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.