文件下载是很多项目中比不可少的一个需求,下面用最原生的servlet来实现文件的下载功能。
记录一下实现的代码,方便以后忘记的时候再来温习一下~
package com.service; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URLEncoder; @WebServlet("/DownFile") public class DownFile extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 查找文件的路径 // servletContext代表整个应用 ServletContext servletContext = getServletContext(); // 获取资源位文件在(服务器)磁盘目录 String realPath = servletContext.getRealPath("img/上课时间安排.png"); //截取文件名,为了客户下载资源的时候有一个文件名 //File.separator表示/,不同操作系统不一样 String fileName = realPath.substring(realPath.lastIndexOf(File.separator) + 1); //有的时候从服务器上下在一个带有中文的文件的话,就会出现乱码,需要解决乱码问题 fileName= URLEncoder.encode(fileName,"utf-8"); //将其读入到输入流中 FileInputStream fileInputStream = new FileInputStream(realPath); //服务器要告诉浏览器需要下载资源问价了 resp.setHeader("content-disposition", "attachment;filename=" + fileName); //设置下载的文件夹,就是截取文件后缀名 String mimeType = servletContext.getMimeType(fileName); resp.setContentType(mimeType); //通过输出流给客户端 ServletOutputStream outputStream = resp.getOutputStream(); byte[] temp = new byte[1024]; int len = 0; while ((len = fileInputStream.read(temp)) != -1) { outputStream.write(temp, 0, len); outputStream.flush(); } } }测试:下载部署在tomcat下面的javaWeb项目下面的background.jpg图片
servlet3.0以下的需要加入下面的映射
<servlet> <servlet-name>DownFile</servlet-name> <servlet-class>com.service.DownFile</servlet-class> </servlet> <servlet-mapping> <servlet-name>DownFile</servlet-name> <url-pattern>/DownFile</url-pattern> </servlet-mapping>运行结果: 成功!!!!