本文依据作者实际工作经历,介绍了如何在非主R的项目里添加一个文件下载工具类的过程,希望能对您有所启发。
1 交待一下背景
最近要在团队其他同学主R的一个项目里添加一个页面,该页面会有一个文件下载的功能。
调研后发现:
- 该项目的后端代码没有类似的工具类
由于该项目不是我负责的小组主R,所以不想实现的太重(例如不想通过引入hutool工具包的方式来搞)
- 要下载的文件存储于公司自研的对象存储服务器上
- 可以拿到文件存储的URL,但该URL只可以在内网访问
- 也可以通过公司自研对象存储服务器提供的SDK获取到存储文件对应的流文件(更安全)
2 前置知识
2.1 下载文件所需的响应头
application/octet-stream
可参考文章:
https://juejin.cn/post/7211401380770349115
2.2 java文件下载所需知识
其实这个很简单,相信很多初学java的都知道,就是将输入流(InputStream)拷贝到输出流(OutputStream)。
3 内部系统可行方案
考虑到文件存储对应的URL只可以在内网访问
,所以不会将URL直接塞给客户端,而是后端服务读取URL,将其转为流,再输出到客户端。因此最初的实现方案如下:
/***** @param fileName 文件名* @param filePath 文件路径 -- 往往该路径只能在内部系统使用,外网访问会失败* @param response* @throws IOException*/
public static void downloadFile(String fileName, String filePath,HttpServletResponse response) throws IOException {//设置响应头:我不知道这个传输过来的东西是什么,//把它存储为一个文件,文件名叫做fileName(如x1.pdf,x2.ppt)response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName