我正在使用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?
我可以看到我们也可以使用已签名的政策上传图片,但是我是否需要为我要上传的每张图片生成签名政策
答案 0 :(得分:2)
预先签名的URL特定于密钥(存储桶中的路径/文件),HTTP谓词(PUT
)以及您要进行的请求的其他属性。
表单POST
不是HTTP PUT
请求,因此这就是为什么当您'PUT
请求时无法使用预签名网址的原因的简单说明重新制作POST
。
不仅动词不可互换,基于浏览器的POST
上传与PUT
完全不同,并且需要签名的策略声明来指示各种表单字段的可接受值。没有它,您无法从表单上传。
是的,您应该为要上传的每个文件生成策略和签名,否则您会将自己暴露给恶意用户,而不是覆盖您希望能够写入的文件。