我们在项目中经常会用到下载功能,所以今天我们先说下下载功能实现的思路,然后通过一个案例代码来具体体现。
1.下载的思路:
①首先要获取我们要操作的文件对象的路径
②然后使用获取的文件对象路径构建一个文件操作流对象
③设置好相关的http响应的头,告诉浏览器怎么来操作我们写回的数据,是下载、打开等等。
④通过response获取字节流,并结合我们的文件流进行读取和写出操作
⑤关闭相关的流资源
2.下载具体servlet实现代码:
package com.servlet; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/download.do") public class DownloadServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * 使用servlet实现文件下载功能 */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = "关系图.jpg"; OutputStream out = null; FileInputStream fis = null; // 1.获取资源文件的路径,当文件名是中文的时候出现不正常的情况,所以需要进行url编码 String path = this.getServletContext().getRealPath("/WEB-INF/classes/com/servlet/" + URLEncoder.encode(fileName, "UTF-8")); try { // 2.根据获取到的路径,构建文件流对象 fis = new FileInputStream(path); out = response.getOutputStream(); // 3.设置让浏览器不进行缓存,不然会发现下载功能在opera和firefox里面好好的没问题,在IE下面就是不行,就是找不到文件 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "No-cache"); response.setDateHeader("Expires", -1); // 4.设置Content-type字段 response.setContentType("image/jpeg"); // 5.设置http响应头,告诉浏览器以下载的方式处理我们的响应信息 response.setHeader("content-disposition", "attachment;filename=" + fileName); // 6.开始写文件 byte[] buf = new byte[1024]; int len = 0; while ((len = fis.read(buf)) != -1) { out.write(buf, 0, len); } } finally { if (fis != null) { fis.close(); } } } }
至此一个简单的servlet实现下载功能已经实现完毕,有不足的地方,希望大家多多提意见!