2015-12-30 3 views
1

Я генерирую назначенный URL с HttpVerb как PUT для загрузки файла в мое ведро. Странно то, что, когда я использую AWSDK для загрузки файла с использованием преданного URL-адреса, он работает нормально. Но когда я использую этот URL-адрес в методе действия формы, я получаю следующую ошибку. «Подписанная нами подпись запроса не соответствует вашей подписке. Проверьте свой ключ и метод подписи».Загрузка изображения в Amazon S3 с использованием AWS PreSignedURL

Ниже приведен HTML-код, чтобы загрузить файл

<html> 
    <head> 
    <title>S3 POST Form</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    </head> 

    <body> 
    <form action="https://mvrskt-certifications.s3-ap-southeast-1.amazonaws.com/Temp/ARMA.jpg?AWSAccessKeyId=AKIAIGPD33Q3DT22IFWQ&Expires=1451482258&Signature=nYx%2F2kDmna5XqEWx5CPTg4OIYDU%3D" method="post" enctype="multipart/form-data"> 
     <input type="hidden" name="key" value="mvrskt-certifications/Temp/ARMA.jpg"> 
     <input type="hidden" name="Content-Type" value="image/jpeg"> 
     <!-- Include any additional input fields here --> 

     File to upload to S3: 
     <input name="file" type="file"> 
     <br> 
     <input type="submit" value="Upload File to S3"> 
    </form> 
    </body> 
</html> 

Ниже является C# .NET код, который я использую для создания PreSignedURL

GetPreSignedUrlRequest request = new GetPreSignedUrlRequest 
       { 
        BucketName = bucketName, 
        Key  = objectKey, 
        Verb  = HttpVerb.PUT, 
        Expires = DateTime.Now.AddMinutes(15) 
       }; 

      string url = null; 
      request.ContentType = "image/jpeg"; 
      url = s3Client.GetPreSignedURL(request); 

Я установил политику CORS на мой как указано ниже

<?xml version="1.0" encoding="UTF-8"?> 
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
    <CORSRule> 
     <AllowedOrigin>*</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedMethod>POST</AllowedMethod> 
     <MaxAgeSeconds>3000</MaxAgeSeconds> 
     <AllowedHeader>Authorization</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 

Я новичок в AWS S3 и получаю союзницей запутать об использовании этого .... Pl помощь о том, как загрузить этот файл, используя форму пост ИЛИ AJAX

Morever мы должны сгенерировать PreSignedURL для каждого изображения, которое я собираюсь загрузить?

Я могу видеть, что мы можем использовать подписанную политику также загружать изображения, но мне нужно, чтобы создать подписанную политику для каждого изображения, которое я собираюсь загрузить

+0

Не могли бы вы разместить свое решение так, как вы решили решить эту проблему? Спасибо –

ответ

2

предварительно подписанный URL специфичен к ключ (путь/файл в ведре), HTTP-глагол (PUT) и другие атрибуты запроса, который вы собираетесь сделать.

Форма POST не запрос HTTP PUT, так что это простое объяснение того, почему вы не можете использовать предварительно подписанный URL для PUT запроса, когда вы делаете POST.

Не только глаголы не взаимозаменяемы, загрузка POST на основе браузера представляет собой совершенно иную операцию, чем PUT, и требует, чтобы подписанный оператор политики указывал допустимые значения для различных полей формы. Вы не можете загружать из формы без этого.

Да, вы должны сгенерировать политику и подпись для каждого файла, который хотите загрузить, в противном случае вы подвергаете себя вредоносному пользователю, перезаписывающему файл, отличный от того, который вы намеревались написать.

+0

Спасибо, Майкл. Информация очень полезна. –