springmvc中的文件下载
定义
用户将服务器中的文件下载到本机的过程
开发文件下载
- 定位哪些文件需要下载
- 将需要下载的文件放入指定的目录中
- 开发一个页面提供一个文件下载的链接
- 开发下载Controller
文件下载代码示例
需要下载的文件在web下的download下的aa.txt;
开发的页面:
<body>
<h2>文件下载</h2>
<a href="${pageContext.request.contextPath}/file/download?fileName=aa.txt">aa.txt</a>
</body>
controller中的代码
@RequestMapping("download")
public void download(String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("下载文件的名称 "+fileName);
//1.根据下载相对目录,下载目录在服务器部署之后的绝对目录
String realPath = request.getSession().getServletContext().getRealPath("/download");
//2.通过文件输入流读取文件
FileInputStream is = new FileInputStream(new File(realPath, fileName));
//3.获取响应输出流
response.setContentType("text/plain;charset=utf-8");//控制流的编码
ServletOutputStream os = response.getOutputStream();
//4.附件下载(默认是下载并在浏览器打开)
//inline是在线打开,attachment是下载;默认是inline
//如果文件浏览器打不开,会自动转为attachment
response.setHeader("content-disposition","attachment;fileName="+fileName);
//5.处理流的复制
int len; //读取长度
byte[] b = new byte[2048]; //缓冲区
while(true){
len = is.read(b);
if(len==-1) break;
os.write(b,0,len);
}
//释放资源
is.close();
os.close();
}
控制文件在线打开或附件下载
在jsp文件中,传一个openStyle的参数;controller接收参数并控制下载方式。
jsp文件:
<h2>文件下载</h2>
<ul>
<li>aa.txt <a href="${pageContext.request.contextPath}/file/download?fileName=aa.txt">在线打开</a> <a href="${pageContext.request.contextPath}/file/download?fileName=aa.txt&openStyle=attach">附件下载</a></li>
<li>bb.jpg <a href="${pageContext.request.contextPath}/file/download?fileName=bb.jpg">在线打开</a> <a href="${pageContext.request.contextPath}/file/download?fileName=bb.jpg&openStyle=attach">附件下载</a></li>
<li>cc.txt <a href="${pageContext.request.contextPath}/file/download?fileName=cc.txt">在线打开</a> <a href="${pageContext.request.contextPath}/file/download?fileName=cc.txt&openStyle=attach">附件下载</a></li>
</ul>
注意在附件下载的url中增加了openStyle参数的传值操作;
controller文件:
@RequestMapping("download")
public void download(String openStyle,String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {
openStyle = openStyle==null?"inline":"attachment";
System.out.println("下载文件的名称 "+fileName);
//1.根据下载相对目录,下载目录在服务器部署之后的绝对目录
String realPath = request.getSession().getServletContext().getRealPath("/download");
//2.通过文件输入流读取文件
FileInputStream is = new FileInputStream(new File(realPath, fileName));
//3.获取响应输出流
response.setContentType("text/plain;charset=utf-8");//控制流的编码
ServletOutputStream os = response.getOutputStream();
//4.附件下载(默认是下载并在浏览器打开)
response.setHeader("content-disposition",openStyle+";fileName="+URLEncoder.encode(fileName,"UTF-8"));
//5.处理流的复制
int len; //读取长度
byte[] b = new byte[2048]; //缓冲区
while(true){
len = is.read(b);
if(len==-1) break;
os.write(b,0,len);
}
//或者使用IOUtils对流进行操作,使用FileUtils对文件进行操作
//IOUtils.copy(is,os);
//IOUtils.closeQuietly(is);
//IOUtils.closeQuietly(os);
is.close();
os.close();
}
解决文件名中文乱码和使用IOUtils来进行文件下载
@RequestMapping("download")
public void download(String openStyle,String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {
openStyle = openStyle==null?"inline":"attachment";
System.out.println("下载文件的名称 "+fileName);
//1.根据下载相对目录,下载目录在服务器部署之后的绝对目录
String realPath = request.getSession().getServletContext().getRealPath("/download");
//2.通过文件输入流读取文件
FileInputStream is = new FileInputStream(new File(realPath, fileName));
//3.获取响应输出流
response.setContentType("text/plain;charset=utf-8");//控制流的编码
ServletOutputStream os = response.getOutputStream();
//4.附件下载(默认是下载并在浏览器打开)
response.setHeader("content-disposition",openStyle+";fileName="+ URLEncoder.encode(fileName,"UTF-8"));
//5.处理流的复制
// int len; //读取长度
// byte[] b = new byte[2048]; //缓冲区
// while(true){
// len = is.read(b);
// if(len==-1) break;
// os.write(b,0,len);
// }
// is.close();
// os.close();
//操作IO流使用IOUtils,操作文件的用FileUtils
IOUtils.copy(is,os);
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}