我正在尝试使用文档(https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html中所述的预签名URL进行上传),我可以检索预签名URL,但是当我尝试在邮递员中进行PUT时,收到以下消息错误:
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
很明显,我的put调用的结构方式与AWS计算签名的方式不匹配。我找不到很多有关此看涨期权要求的信息。
我试图将Content-Type的标题修改为multipart / form-data和application / octet-stream。我还尝试取消选中邮递员的标头部分,并在选择文件的形式数据和二进制设置上都依赖正文类型。表单数据设置会将以下内容添加到调用中:
Content-Disposition:表单数据; name =“ thefiletosend.txt”; filename =“ thefiletosend.txt
此外,我注意到邮递员将其称为“临时标头”的内容包括如下:
主持人:s3.amazonaws.com 内容类型:文本/纯文本 用户代理:PostmanRuntime / 7.13.0 接受: / 缓存控制:无缓存 邮递员令牌:e11d1ef0-8156-4ca7-9317-9f4d22daf6c5,2135bc0e-1285-4438-bb8e-b21d31dc36db 主持人:s3.amazonaws.com 接受编码:gzip,放气 内容长度:14 连接:保持活动状态 缓存控制:无缓存
Content-Type标头可能是问题之一,但是我不确定如何在邮递员中排除这些“临时标头”。
我正在如下生成lambda中的预签名URL:
public string FunctionHandler(Input input, ILambdaContext context)
{
_logger = context.Logger;
_key = input.key;
_bucketname = input.bucketname;
string signedURL = _s3Client.GetPreSignedURL(new GetPreSignedUrlRequest()
{
Verb = HttpVerb.PUT ,
Protocol = Protocol.HTTPS,
BucketName = _bucketname,
Key = _key,
Expires = DateTime.Now.AddMinutes(5)
});
returnObj returnVal = new returnObj() { url = signedURL };
return JsonConvert.SerializeObject(returnVal);
}
答案 0 :(得分:2)
我能够使用POST请求在Postman中工作。以下是对我有用的详细信息。当我打电话给我的lambda以获取一个预签名的URL时,这是返回的json(在我屏蔽了敏感的和特定于应用程序的信息之后):
{
"attachmentName": "MySecondAttachment.docx",
"url": "https://my-s3-bucket.s3.amazonaws.com/",
"fields": {
"acl": "public-read",
"Content-Type": "multipart/form-data",
"key": "attachment-upload/R271645/65397746_MySecondAttachment.docx",
"x-amz-algorithm": "AWS4-HMAC-SHA256",
"x-amz-credential": "WWWWWWWW/20200318/us-east-1/s3/aws4_request",
"x-amz-date": "20200318T133309Z",
"x-amz-security-token": "XXXXXXXX",
"policy": "YYYYYYYY",
"x-amz-signature": "ZZZZZZZZ"
}
}
在Postman中,创建一个POST请求,并使用“ form-data”输入您返回的所有字段,并使用与上面显示的signedURL中返回的字段名称完全相同的字段名称。但是,请勿设置内容类型。然后再添加一个名为“ file”的密钥:
在word文件的右侧,如果您单击下拉列表,则可以浏览到文件并将其附加:
如果有帮助,我正在使用用python编写的lambda生成预签名的URL,以便用户可以上传附件。代码如下:
signedURL = self.s3.generate_presigned_post(
Bucket= "my-s3-bucket",
Key=putkey,
Fields = {"acl": "public-read", "Content-Type": "multipart/form-data"},
ExpiresIn = 15,
Conditions = [
{"acl": "public-read"},
["content-length-range", 1, 5120000]
]
)
希望这会有所帮助。
答案 1 :(得分:2)
您的预签名网址应类似于https://bucket-name.s3.region.amazonaws.com/folder/filename.jpg?AWSAccessKeyId=XXX&Content-Type=image%2Fjpeg&Expires=XXX&Signature=XXX
您可以通过邮递员通过以下方式上传到S3:
PUT
请求,Body
-> binary
-> Select file
答案 2 :(得分:0)
您可以通过邮递员上传到 S3
将上面的 url 设置为端点 选择 PUT 请求, 正文 -> 二进制文件 -> 选择文件