如何通过带有正确Content-Length的预签名URL将图像上传到s3?

时间:2019-05-13 11:11:59

标签: angular amazon-s3 angular-httpclient

我正在尝试通过预签名的url将带有Angular HttpClient的图像上传到具有PUT的S3存储桶。该文件本身是在存储桶中创建的,但其Content-Length始终为0。

预签名的URL是通过AWS Java SDK v2在服务器端生成的。

我尝试像

一样手动设置Content-Length
headers: 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。

0 个答案:

没有答案