我想上传文件到S3预签名的网址,我已经产生了使用我的后端应用程序。对于前端,我使用的是角HttpClient v8.2.9,当我使用put请求时,它正在工作,代码如下所示。
const formData = new FormData();
formData.append('file', file, file.name);
this.http.put(preSignedUrl, formData, {
responseType: 'text'
}).subscribe(respond => {
console.log('__________OK_________');
console.log(respond);
},
error => {
console.log('__________ERROR_________');
console.log(error);
});但是当我使用post请求时,我总是会发现一个错误:
我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。
请求邮寄的鳕鱼会是这样的。
const formData = new FormData();
formData.append('file', file, file.name);
this.http.post(preSignedUrl, formData, {
responseType: 'text'
}).subscribe(respond => {
console.log('__________OK_________');
console.log(respond);
},
error => {
console.log('__________ERROR_________');
console.log(error);
});
});由于生成的预签名URL也可以用于我自己的微服务,它可以通过post请求接收文件,所以我不能使用amazon库在前端上传文件,而且必须是一般的。上面的post请求的例子是使用我的微服务,我对此很满意,我也想让S3和这个帖子一起工作。因此,我不需要改变我的请求,根据我要上传到哪里。
下面是我的java后端的代码,我为S3生成了预签名的URL。
AmazonS3 s3client = makeClient();
Date expirationTime = calculateExpirationTime();
GeneratePresignedUrlRequest generatePresignedUrlRequest =
new GeneratePresignedUrlRequest(bucketName, fullPath, HttpMethod.PUT);
generatePresignedUrlRequest.setExpiration(expirationTime);
return s3client.generatePresignedUrl(generatePresignedUrlRequest).toString();如果我将HttpMethod的后端代码更改为POST,我也会得到相同的错误,并将请求放在前端将无法工作。
发布于 2019-12-30 18:26:27
我想我又发现了问题所在。如果其他人有这个问题,我就把它发到这里。如果我们查看s3 SDK的文档。要生成一个预先签名的URL,我们不能使用POST。
* @param方法*当使用预签名的URL时,将在*请求中使用的HTTP方法(GET、PUT、DELETE、HEAD)。
所以在我的情况下放是最合适的。
上面写着
spring引导只期望将多部分/窗体数据作为POST请求的一部分。
因此,我需要做的是,我需要覆盖spring方法来接受put多部分上传请求。
https://stackoverflow.com/questions/59481968
复制相似问题