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

标签 javascript html amazon-web-services amazon-s3 aws-sdk

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

下面是上传文件的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 的新手,对使用它感到非常困惑...... 请协助如何使用表单发布或 AJAX 上传此文件

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

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

最佳答案

预签名 URL 特定于 key (存储桶中的路径/文件)、HTTP 动词 (PUT) 以及您要发出的请求的其他属性。

表单 POST 不是 HTTP PUT 请求,所以这就是为什么不能对 使用预签名 URL 的简单解释PUT 请求,当您发出 POST 时。

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

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

关于javascript - 使用 AWS PreSignedURL 将图像上传到 Amazon S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34530407/

相关文章:

javascript - 在 JavaScript 中定义固定的排序顺序

javascript - clearTimeout() 不清除定时器

javascript - 如何用JS改变href属性的值?

javascript - 自适应布局上的垂直自适应图像对齐

html - 将图像定位在底部与导航内联

amazon-web-services - AWS CodeBuild 中的 GetAuthorizationToken 权限错误

amazon-web-services - 将国际化域名与 Route 53 和 S3 结合使用

git - 将 AWS IAM ARN 值保留在公共(public) Git 存储库中是否安全?

循环内的 JavaScript 闭包 – 简单的实际示例

javascript - 显示任何访问者最近访问过的 html 页面