实现文件下载步骤
- 1.获取要下载的文件名
- 2.读取要下载的文件内容
- 3.把下载的文件内容返回给客户
- 4.在回传前,通过响应头告诉客户端返回的数据类型
- 5.通过响应头告诉客户端收到的数据是要下载的
具体实现 导入 commons-io-1.4.jar
包
编写Servlet程序
代码语言:javascript复制public class FileUpload extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//实现文件下载
/**
* 1.获取要下载的文件名
* 2.读取要下载的文件内容
* 3.把下载的文件内容返回给客户端
* 4.在回传前,通过响应头告诉客户端返回的数据类型
* 5.通过响应头告诉客户端收到的数据是要下载的
*/
//1.
String downLoadFileName = "default.jpg";
//2.读取要下载的文件内容通过ServletContext对象读取
ServletContext servletContext = getServletContext();
//开始读取
//获取mime类型
String mimeType = servletContext.getMimeType("/file/" downLoadFileName);
//2.0告诉客户端服务端返回的数据类型
resp.setContentType(mimeType);
//告诉客户端,收到的数据需要下载 attachment:附件 filename表示下载的文件名,客户端下载后的文件名
resp.setHeader("Content-Disposition","attachment;filename=" downLoadFileName);
//流的方式读取文件数据 输入流
InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" downLoadFileName);
//2.1获取一个输出流,将数据输出到客户端
ServletOutputStream outputStream = resp.getOutputStream();
//2.2 直接将输入流复制成输出流,将数据输出到客户端
IOUtils.copy(resourceAsStream,outputStream);
}
}
配置web.xml
代码语言:javascript复制 <servlet>
<servlet-name>FileUpload</servlet-name>
<servlet-class>com.jsp.web.FileUpload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileUpload</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
此时基本的文件下载程序完成,但需要解决中文乱码问题 如下代码,客户端不能获取到正常的文件名 ??.jpg
resp.setHeader("Content-Disposition","attachment;filename="测试.jpg");
URLEncoder 解决谷歌浏览器和IE浏览器中文乱码
代码语言:javascript复制...
resp.setHeader("Content-Disposition","attachment;filename=" URLEncoder.encode("测试.jpg","UTF-8"));
...
Base64编码解决火狐浏览器中文乱码 将
代码语言:javascript复制resp.setHeader("Content-Disposition","attachment;filename=" URLEncoder.encode("测试.jpg","UTF-8"));
改为如下
代码语言:javascript复制resp.setHeader("Content-Disposition","attachment;filename="=?charset?B?xxxx?=")
"=?charset?B?xxxx?="
说明
=?:编码内容开始
charset :字符集
B:表示BASE64编码
xxxx:表示文件名BASE64编码后的内容
?=:编码内容结束
代码语言:javascript复制resp.setHeader("Content-Disposition","attachment;filename==?UTF-8?B?" new BASE64Encoder().encode("测试.jpg".getBytes("UTF-8")) "?=");
判断 User-Agent请求头动态确定编码方式
代码语言:javascript复制 if(req.getHeader("User-Agent").contains("FireFox")){
resp.setHeader("Content-Disposition","attachment;filename==?UTF-8?B?" new BASE64Encoder().encode("测试.jpg".getBytes("UTF-8")) "?=");
}else{
resp.setHeader("Content-Disposition","attachment;filename=" URLEncoder.encode("测试.jpg","UTF-8"));
}