我正在尝试通过预签名的url将带有Angular HttpClient的图像上传到具有PUT的S3存储桶。该文件本身是在存储桶中创建的,但其Content-Length始终为0。
预签名的URL是通过AWS Java SDK v2在服务器端生成的。
我尝试像
一样手动设置Content-Lengthheaders: new HttpHeaders({'Content-Type': file.type, 'Access-Control-Expose-Headers': 'Content-Disposition', 'Content-Length': `${file.size}`})
没有成功。
我还检查了AWS文档https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html
生成预签名网址的方法:
fun getUploadUri(key: String, bucket: String): URI {
val request = SdkHttpFullRequest.builder()
.encodedPath("/$key")
.host("$bucket.s3.${awsProperties.region}.amazonaws.com")
.protocol("https")
.method(SdkHttpMethod.PUT)
.build()
return AwsS3V4Signer.create().presign(request, params).uri
}
调用在客户端的函数:
private save(presignedUri: string, file: File): Observable<string> {
return this.http.put(presignedUri, new FormData().append('file', file, file.name), {
reportProgress: true,
responseType: 'text',
headers: new HttpHeaders({'Content-Type': file.type, 'Access-Control-Expose-Headers': 'Content-Disposition', 'Content-Length': `${file.size}`})
});
}
使用此代码,该文件在S3中创建,但其Content-Length始终为0。