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

uploading an image to Amazon S3 using AWS PreSignedURL

我正在使用 HttpVerb 生成预签名 URL 作为 PUT 以将文件上传到我的存储桶。 奇怪的是,当我使用 AWSSDK 使用 preseigned URL 上传文件时,它工作正常。但是,当我在表单操作方法中使用此 URL 时,出现以下错误。 "The request signature we calculated does not match the signature you provided. Check your key and signing method."

下面是 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 的新手,对使用它感到完全困惑.... 请协助如何使用表格 post 或 AJAX

上传此文件

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

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

A pre-signed URL 特定于密钥(存储桶中的path/file)、HTTP 动词(PUT)和请求的其他属性

表单 POST 不是 HTTP PUT 请求,所以这就是为什么不能对 pre-signed URL 使用 URL 的简单解释=10=] 请求时 POST.

不仅动词不可互换,browser-based POST 上传是与 PUT 完全不同的操作,并且需要签署的政策声明来指明可接受的值各种表单字段。如果没有它,您将无法从表单上传。

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