使用AWS PreSignedURL将图像上传到Amazon S3

时间:2015-12-30 13:22:57

标签: javascript html5 amazon-web-services amazon-s3 aws-sdk

我正在使用HttpVerb作为PUT生成预签名URL,以将文件上传到我的存储桶。 奇怪的是,当我使用AWSDK使用预先分配的URL上传文件时,它工作正常。但是当我在表单操作方法中使用此URL时,我收到以下错误。 "我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。"

以下是上传文件的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>

下面是我用来生成PreSignedURL

的C#.NET代码
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协助如何使用表格帖子OR AJAX上传此文件

我们是否需要为我要上传的每张图片生成PreSignedURL?

我可以看到我们也可以使用已签名的政策上传图片,但是我是否需要为我要上传的每张图片生成签名政策

1 个答案:

答案 0 :(得分:2)

预先签名的URL特定于密钥(存储桶中的路径/文件),HTTP谓词(PUT)以及您要进行的请求的其他属性。

表单POST不是HTTP PUT请求,因此这就是为什么当您'PUT请求时无法使用预签名网址的原因的简单说明重新制作POST

不仅动词不可互换,基于浏览器的POST上传与PUT完全不同,并且需要签名的策略声明来指示各种表单字段的可接受值。没有它,您无法从表单上传。

是的,您应该为要上传的每个文件生成策略和签名,否则您会将自己暴露给恶意用户,而不是覆盖您希望能够写入的文件。