我正在尝试使用文档(https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html)中描述的预签名URL进行上载。我可以检索预签名URL,但当我尝试在Postman中执行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计算签名的方式不匹配,我找不到很多关于这个put调用需要什么的信息。
我尝试将Content-Type的头修改为multipart/form-data和application/octet-stream。我还尝试取消postman中的headers部分,并在选择文件的地方依赖于form-data和binary设置的body类型。form-data设置导致以下内容被添加到调用中:
内容处置:如果您有任何问题,请与我们联系。文件名=“要发送的文件. txt
此外,我注意到postman正在包括它所谓的“临时头”如下:
主机:s3.amazonaws.com内容类型:text/plain用户代理:Postman运行时/7.13.0接受:/ 高速缓存控制:无缓存 Postman 令牌:主机:s3.amazonaws.com接受编码:gzip,缩小内容长度:14连接:保活高速缓存控制:无缓存
Content-Type头可能是问题之一,但我不确定如何在postman中排除这些“临时头”。
我在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);
}
5条答案
按热度按时间jtjikinw1#
您的预签名URL应该类似于
https://bucket-name.s3.region.amazonaws.com/folder/filename.jpg?AWSAccessKeyId=XXX&Content-Type=image%2Fjpeg&Expires=XXX&Signature=XXX
您可以通过 Postman 上传到S3
1.将以上URL设置为终结点
1.选择
PUT
请求、Body
-〉binary
-〉Select file
ttygqcqt2#
我可以在Postman中使用POST请求来实现这个功能。下面是对我有用的详细信息。当我调用lambda来获得一个预先签名的URL时,返回的json如下(在我屏蔽了敏感和应用程序特定的信息之后):
在Postman中,创建一个POST请求,并使用“form-data”输入所有返回的字段,字段名与上面所示的signedURL中返回的字段名完全相同。但是,不要设置内容类型。然后再添加一个名为“file”的键:
如果单击word file右侧的下拉列表,则可以浏览到您的文件并附加它:
为了方便起见,我使用了一个用python编写的lambda来生成一个预先签名的URL,这样用户就可以上传附件了。代码如下所示:
希望这对你有帮助。
r8xiu3jd3#
您的预签名URL应该类似于https://bucket-name.s3.region.amazonaws.com/folder/filename.jpg?AWSAccessKeyId=XXX&Content-Type=image%2Fjpeg&Expires=XXX&Signature=XXX
您可以通过 Postman 上传到S3
将上面的url设置为端点选择PUT请求,主体-〉二进制-〉选择文件
vc9ivgsu4#
我也面临着同样的问题,下面是它如何为我工作。
请注意,我使用AWS S3 Java SDK制作签名URL,因为我的后端是Java。我在创建此签名URL时将内容类型指定为“application/octet-stream”,以便可以上传任何类型的内容。以下是生成签名URL的Java代码。
如果您有任何问题,请联系我们。如果您有任何问题,请联系我们。如果您有任何问题,请联系我们。如果您有问题,请联系我们。如果您有任何问题,请联系我们。如果您有问题,请联系我们。如果您的请求是空的,则返回空的。返回预定义的请求。如果您有一个新的自定义运行时异常,请使用以下方法:()}}
##现在使用Postman上传文件
1.将生成的url设置为端点
1.选择PUT请求,
1.主体-〉二进制-〉选择文件
1.将头内容类型设置为应用程序/八位字节流 (这一点我之前没有注意到)
omhiaaxx5#
这实际上取决于您如何生成URL,
如果使用JAVA生成,
1.将生成的url设置为端点
1.选择PUT请求,
1.主体-〉二进制-〉选择文件x1c 0d1x
如果使用PYTHON生成,
1.创建一个POST请求,并使用
form-data
输入所有返回的字段,字段名称与上面所示的signedURL中返回的字段名称完全相同。1.但是,不要设置内容类型,然后再添加一个名为“file”的键:
参考已接受的答案图片