我们先来看一个最简单的文件下载的例子:
package com.yyz.response; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //文件下载 public class ResponseDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String realpath = this.getServletContext().getRealPath("/download/1.gif"); String filename = realpath.substring(realpath.lastIndexOf("\\")+1); response.setHeader("content-disposition", "attachment;filename="+filename); //服务器通过这个头,告诉浏览器以下载方式打开数据 FileInputStream in = new FileInputStream(realpath); int len = 0; byte buffer[]=new byte[1024]; OutputStream out = response.getOutputStream(); while((len = in.read(buffer))>0){ out.write(buffer, 0, len); } in.close(); //out不用close,response在销毁的时候服务器会自动关闭与response相关的流。 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
该段代码的功能是从服务器端下载图片1.png。目录结构用MyEclipse的package explorer显示如下:
让我们增加一点难度,我们要下载的文件是一个中文名字的文件。由于在http协议中头文件中的东西只能是ASCII字符,因而通过上述方式(直接将 String realpath = this.getServletContext().getRealPath("/download/1.gif");改为 String realpath = this.getServletContext().getRealPath("/download/图片.gif");)直接拿文件,
会出现乱码问题。附上测试结果:
要解决这个问题,要用到 URLEncoder类的encode方法:
package com.yyz.response; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //中文文件下载时,中文文件名要经过URL编码。 public class ResponseDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String realpath = this.getServletContext().getRealPath("/download/图片.gif"); String filename = realpath.substring(realpath.lastIndexOf("\\")+1); response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8")); //本函数将字符串以 URL 编码 FileInputStream in = new FileInputStream(realpath); int len = 0; byte buffer[]=new byte[1024]; OutputStream out = response.getOutputStream(); while((len = in.read(buffer))>0){ out.write(buffer, 0, len); } in.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
附上测试结果:
另外这里有一个小细节需要大家注意:
不能用FileReader代替FileInputStream。用FileReader会丢失数据,原因是这样的:FileReader是字符流,而图片,媒体文件等的数据都是以01的方式存储,用FileReader读的时候需要查阅一个编码表,如果未指定一种编码,则使用相应平台的默认编码。如在中国的电脑就会去查GB2312。当读到GB2312码表中不存在的编码时,会将该数据编码成'?',结束后数据就变成中文和'?'的混合。发到客户端后显示时再次查阅码表,将所有的'?'替换成'?'的编码,就会丢失数据。向这种细节只需要记住一点:字节流可以处理任意类型的数据,字符流只能处理字符数据。
本文向大家介绍SpringMVC实现文件下载功能,包括了SpringMVC实现文件下载功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了SpringMVC文件下载的具体代码,供大家参考,具体内容如下 两个案例 1.为登录用户提供下载服务。 2.阻止仅通过输入网址即可获取下载。 文件下载概览 为了将文件发送给浏览器,我们需要在控制器中完成以下操作: 对请求处理方法使用vo
本文向大家介绍vue+axios实现post文件下载,包括了vue+axios实现post文件下载的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了vue+axios实现post文件下载的具体代码,供大家参考,具体内容如下 功能:点击导出按钮,提交请求,下载excel文件; 这里是axios的post方法。get方法请点击这里=》here 第一步:跟后端童鞋确认交付的接口的respo
本文向大家介绍C#中WebClient实现文件下载,包括了C#中WebClient实现文件下载的使用技巧和注意事项,需要的朋友参考一下 鉴于各种复杂的网络环境,笔者决定采用不同的编程接口进行下载尝试,以增加程序的可用性。 这里仅介绍使用 WebClient 的方法,后续的文章会介绍其他的方法。博文中主要介绍思路和关键代码,完整的 demo 附在文末。 使用代理访问网络 很多公司的员工都是通过公司设
本文向大家介绍Python实现批量下载文件,包括了Python实现批量下载文件的使用技巧和注意事项,需要的朋友参考一下 Python实现批量下载文件 其他网友的方法: 以上便是本文给大家分享的全部内容了,小伙伴们可以测试下哪种方法效率更高呢。
我是GWT和一般Web应用程序的新手。 我正在制作一个GWT web应用程序。它提供的一个功能是通过单击网页上的按钮下载文件。不幸的是,文件本身并不是物理上位于服务器端。服务器端需要通过对另一个web服务的REST调用来获取文件的InputStream。 我的问题是: 如何将流传递到客户端,以便浏览器可以开始下载? 在开始之前,我必须在服务器上物理写入文件吗? 非常感谢 编辑:我找到了这个例子:使
在Web服务器上实现文件下载功能很容易。只要将URL指向要下载的文件即可。但是这要有一个前提,就是要下载的文件必须位于在Web服务器中部署的Web目录中。但有时需要在下载文件之前做一些其他的事,如验证用户是否有权限下载该文件。在这种情况下,就必须通过动态下载的方式(也就是通过程序来读取待下载的文件,而不是直接由Web服务器负责下载)来实现。 下面的例子演示了如何通过Servlet实现动态下载文件的