Java Web应用程序实现基础的文件下载功能的实例讲解
基础思路:
之前的思路一直是弹出一个框问用户想要存放文件的位置,然后我再生成个文件放到那。然而我这个想法并没有成功。
点击链接来下载文件的方式很简便,后台把文件流输出来,通过浏览器实现下载功能,包括询问位置与文件存放,大多数浏览器会配置一个固定位置,不一定每次都问。
前端就非常简单了,一个<a>标签,href=“后台方法地址”,如果你的需求不能直接用超链接方式,可以在js里写
window.location.href=“后台方法地址"。
这样跳转到后台方法后
StringfilePath=this.getClass().getClassLoader().getResource("").toURI().getPath()
+"/exportPdf.pdf";//文件在项目中的路径
Fileoutfile=newFile(filePath);
Stringfilename=outfile.getName();//获取文件名称
InputStreamfis=newBufferedInputStream(newFileInputStream(
filePath));
byte[]buffer=newbyte[fis.available()];
fis.read(buffer);//读取文件流
fis.close();
response.reset();//重置结果集
response.addHeader("Content-Disposition","attachment;filename="
+newString(filename.replaceAll("","").getBytes("utf-8"),
"iso8859-1"));//返回头文件名
response.addHeader("Content-Length",""+outfile.length());//返回头文件大小
response.setContentType("application/octet-stream");//设置数据种类
//获取返回体输出权
OutputStreamos=newBufferedOutputStream(response.getOutputStream());
os.write(buffer);//输出文件
os.flush();
os.close();
浏览器会直接识别这种形式的文件输出,弹出对话框。
注意此方法一定要用链接方式调后台,使用ajax和XMLHttpRequest方式都是不行的,这样返回的文件流会返回到方法的回调函数中,当然如果你想在js中获取文件,这样也行。
实例
packagecn.itcast.day06.web.servlet;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.URLEncoder;
importjavax.servlet.ServletContext;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassDownloadServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//实现防盗链功能
//获得referer头用于说明来访者来自哪里
Stringreferer=request.getHeader("referer");
if(referer==null||!referer.startsWith("http://localhost")){
//是盗链者
response.sendRedirect("/day06/index.jsp");
return;
}
//解决response中文乱码问题
response.setContentType("text/html;charset=utf-8");//设置消息体的编码
//通过http协议发送的http响应消息头不能出现中文中文必须要经过url编码
Stringfilename=URLEncoder.encode("美女.jpg","utf-8");
//通知浏览器以下载的方式读取资源
response.setHeader("content-disposition","attachment;filename="+filename);
//读取图片数据发给ie浏览器
StringwebPath="/download/美女.jpg";//相当于当前web应用的path
ServletContextservletContext=super.getServletContext();
InputStreamin=servletContext.getResourceAsStream(webPath);
OutputStreamout=response.getOutputStream();
intlen;
byte[]buffer=newbyte[1024];
while((len=in.read(buffer))!=-1)
out.write(buffer,0,len);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}