AWS上传文件设置MIME Content Type问题

在使用AWS S3上传PDF或图片时,遇到浏览器预览与下载的问题。通过curl -I检查发现,Content-Type设置不正确导致。未显式设置Content-Type时,AWS SDK可能自动分配类型。经过代码分析,确认AmazonS3Client的putObjectRequest方法中,SDK会设置Content-Type,但使用单例可能导致内存泄漏。建议手动设置Content-Type以优化内存管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近发现上传到AWS S3服务器上的文件(PDF或者图片)有个问题,在浏览器粘贴资源地址,有的文件直接在浏览器里预览,有的则是直接下载的。用curl -I 查看了下不同文件的http响应头,显示的content type一种是application/otcet-stream(有的显示application/x-download),另一种则是application/pdf。OK,找到原因了,响应头里content type为application/otcet-stream或application/x-download的文件,浏览器直接当作文件流直接下载下来,content type为application/pdf的文件,如果浏览器设置了pdf预览,则以预览形式打开。

检查了下自己写的上传文件的代码,发现并没有显示设置content type的值,会不会是由于没有设置content type导致S3服务器分配了个默认的类型。测试了下,随意上传了个pdf,结果S3服务器上显示的http响应头里, content type显示是application/pdf,看来有可能是aws java sdk帮忙做了这件事。

一步步跟进代码,发现的确是sdk帮忙设置了content type,代码片段见com.amazonaws.services.s3.AmazonS3Client类的public PutObjectResult putObject(PutObjectRequest putObjectRequest) 方法

public PutObjectResult putObject(PutObjectRequest putObjectRequest) throws AmazonClientException, AmazonServiceException {
    ...
    // Only set the content type if it hasn't already been set
    if (metadata.getContentType() == null) {
        metadata.setContentType(Mimetypes.getInstance().getMimetype(file));
    }
    ...
}

但是感觉Mimetypes为单例,将file对象传入单例对象的方法会导致file对象无法被垃圾回收器回收吧。。。所以尽量自己设置content type避免此类情况。

目前已知1.10.67版本以上的aws java sdk里会对未显示设置的Content Type进行文件类型判断。另外一个同事用aws js sdk(版本不晓)没有显示设置content type则会被默认设置为application/otcet-stream。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值