Angular post请求无法将文件上载到S3预签名URL,但put可以使用HttpClient

Angular post请求无法将文件上载到S3预签名URL,但put可以使用HttpClient,angular,post,amazon-s3,httpclient,pre-signed-url,Angular,Post,Amazon S3,Httpclient,Pre Signed Url,我想将文件上传到我使用后端应用程序生成的S3预签名URL。对于前端,我使用的是angular HttpClient v8.2.9 当我使用put请求时,它正在工作,代码如下所示 const formData = new FormData(); formData.append('file', file, file.name); this.http.put(preSignedUrl, formData, { responseTyp

我想将文件上传到我使用后端应用程序生成的S3预签名URL。对于前端,我使用的是angular 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);
               });
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);
               });
         });
但是当我使用post请求时,我总是会得到这样一个错误

我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法

post请求的cod是这样的

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);
               });
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也能与post一起工作。因此,我不必根据上传到的位置更改请求

下面是我的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,我也会收到相同的错误,并且将请求放在前端将无法工作。

我想我再次发现了问题所在。如果其他人有这个问题,我就把它贴在这里。 如果我们看一下S3SDK的文档。要生成预签名的URL,我们不能使用POST

所以在我的情况下,PUT是最合适的

我还发现了下面的链接

上面写着

spring boot只希望多部分/表单数据作为POST请求的一部分


因此,我需要做的是重写spring方法,以接受put多部分上传请求。

我想我再次发现了问题所在。如果其他人有这个问题,我就把它贴在这里。 如果我们看一下S3SDK的文档。要生成预签名的URL,我们不能使用POST

所以在我的情况下,PUT是最合适的

我还发现了下面的链接

上面写着

spring boot只希望多部分/表单数据作为POST请求的一部分

因此,我需要做的是重写spring方法,以接受put多部分上传请求