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); } }