背景
我们的系统使用Minio进行文件存储,并通过服务端提供统一的上传接口。此外,我们还使用Nginx进行服务代理。前端需求中包括对上传PDF文件的预览功能。
问题描述
在前端预览PDF文件时,我们采用window.open
方法在新窗口中打开文件。期望的行为是浏览器能直接预览这些PDF文件。然而,在Chrome浏览器(版本号小于116)中,我们观察到了不一致的行为:
-
可预览的PDF : 这些是单独上传的PDF文件,服务端返回的
Content-Type
为application/pdf
。Chrome能够直接预览这种类型的文件。 -
不可预览的PDF : 这些是打包成ZIP文件进行批量上传的PDF文件。服务端返回的
Content-Type
为application/octet-stream
,导致Chrome会直接下载这些文件。
分析与解决方案
针对上述问题,我们有以下疑问:
- 为什么同一个文件存储服务会返回不同的
Content-Type
?
可能的原因:
-
Nginx配置问题 : 可能对不同的PDF文件设置了不同的
Content-Type
头信息。 -
上传服务问题 : 在查看批量上传和单个上传的代码后,发现批量上传中有以下代码设置
Content-Type
:
java
FileItem item = new DiskFileItemFactory().createItem(
file.getName() ,
"application/octet-stream" ,
true ,
file.getName()
);
解决方案:
-
调整Nginx的配置,确保返回的
Content-Type
头信息为application/pdf
。 -
修改相关的Java代码,以设置正确的
Content-Type
。
结语
祝大家周末愉快!