情景:
1、用户上传的文件存储于内网的某文件管理服务器中
2、前端在某些情景上,需要展示用户上传的图片、或文档
3、但是!用户访问时,无法访问内网资源!!!
踩坑:
原以为数据库记录文件路径,然后在传给前端即可,但是没想到。。。天杀的文件服务器不能用于公网访问
解决方案:
1、在服务端,提供一个支持get访问的web接口,用于接收文件的唯一标识(需要提供HttpServletResponse 入参)
2、用此接口调用内网相关处理逻辑,将文件转换为byte[],原因服务端可以访问内网资源,所以转换数据这里,需要自己想办法了,无非就是InputStream转byte[]
3、设置此response 为强制下载
response.setContentType("application/force-download"); // 此处需要动态拼接自己的文件类型,示例:application/force-download;application/vnd.ms-excel
response.setHeader("Content-Disposition", "attachment;fileName=" + 文件名称.后缀名);
// 文件类型参考:https://tool.oschina.net/commons
4、将拿到的byte[](二进制数据流) 写入到response中,并强制刷新输出流
实现原理:
1、下载文件也好,访问资源也罢,实际上多数都是get请求,既然是请求,那么都可以调用后端的某个controller进行处理
2、前端标签的 img src=“此处是可以使用二进制数据的”,这样就解决了图片显示的问题(即使设置了强制下载,也可以正常显示,具体原因未知,我个人认为还是二进制数据放到了src中)
3、文件下载,文件下载也是get请求,当然,如果你的项目是POST请求,那么改造接口支持POST就行了,由于设置了强制下载,所以,文件下载自然实现了