首先你需要有一个网页,这个我这里的模板网页就是一个上传页面,我打算在这个上传文件的页面中添加一个下载文件的功能,先写JSP页面:
<a href="${pageContext.request.contextPath}/file/download?filename=123.jpg">下载文件:使用请求参数传递文件名</a>
a href表示这个文字“下载文件:使用请求参数传递文件名”是带有链接的,点进去就是访问Controller文件里带有file/download地址的方法
映射文件是不需要写什么的,接下来就来看Controller文件:
@RequestMapping("/download")
public void download(String filename, HttpSession session, OutputStream outputStream){
System.out.println(filename);
String path=session.getServletContext().getRealPath("/WEB-INF/upload/");
File file=new File(path,filename);
try {
StreamUtils.copy(new FileInputStream(file),outputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
这里也很容易进行解释,当JSP页面找到这里的时候,JSP页面也传来一个数据,就是filename=123.jpg这个数据通过JSP页面传过来了,直接作为参数传到String好的filename中,然后又String一个地址,作为需要下载的文件地址:String path=session.getServletContext().getRealPath("/WEB-INF/upload/");
其中WEB-INF/upload就是文件存放的地方
File file=new File(path,filename);这里就是把刚刚的两个参数传进去,一个是下载的文件路径,一个是文件名
最后一步,也是最关键的一步,就是通过输入流和输出流对需要下载的数据进行复制名字并且进行下载
StreamUtils.copy(new FileInputStream(file),outputStream);
StreamUtils.copy就是复制的意思,把输入流的名字和路径也就是 file的名字和路径,直接复制给输出流当中,让输出流可以对相对应的文件进行下载
最终整理一下思路,先做jsp页面连接Controller并且传递filename的数据,再做一个Controller文件进行三个参数的设定,filename的接收,session接收文件地址还有就是输出流outputStream