Welcome

首页 / 网页编程 / JSP / jsp实现Servlet文件下载的方法

本文实例讲述了jsp实现Servlet文件下载的方法。分享给大家供大家参考。具体如下:
package com;import java.io.IOException;import java.io.PrintWriter;import java.net.URLEncoder;import java.util.Date;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;/** * 文件下载类。为了防止客户端浏览器直接打开目标文件(例如在装了MS Office套件的Windows中的IE浏览器可能就会直接在IE浏览器中打开你想下载的doc或者xls文件),在响应头里加入强制下载的MIME类型。 */public class DownloadFile extends HttpServlet {private static final Log log = LogFactory.getLog(DownloadFile.class);public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {long timeStart = 0;if(log.isDebugEnabled()){timeStart=System.currentTimeMillis();}response.setContentType("application/x-download charset=UTF-8");java.io.FileInputStream fis = null;String filepath = request.getRealPath("");javax.servlet.ServletOutputStream sos = null;// System.out.println("DownloadFile filename:" + filename);try {if(request.getParameter("filename")==null||request.getParameter("showName")==null){return;}String filename = request.getParameter("filename");String showName = request.getParameter("showName");request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");java.io.File file = new java.io.File(filepath + filename);if (!file.exists()) {log.error(file.getAbsolutePath() + " 文件不存在!");return;}// 读取文件流fis = new java.io.FileInputStream(file);// 设置下载保存的文件名sos = response.getOutputStream();showName += filename.substring(filename.lastIndexOf("."));String contentDisposition = "", browser = getBrowser(request);if ("IE".equals(browser)) {contentDisposition = "attachment; filename=" + URLEncoder.encode(showName, "UTF-8").replace("+", "%20");} else if ("CH".equals(browser)) {contentDisposition = "attachment; filename=" + MimeUtility.encodeText(showName, "UTF8", "B");} else if ("SF".equals(browser)) {contentDisposition = "attachment; filename=" + new String(showName.getBytes("UTF-8"), "ISO8859-1");} else {contentDisposition = "attachment; filename*=UTF-8""" + URLEncoder.encode(showName, "UTF-8").replace("+", "%20");}response.setHeader("Content-Disposition", contentDisposition);int byteCount = 0; if (fis != null) {byte[] buff = new byte[1024];int bytesRead;while(-1 != (bytesRead = fis.read(buff, 0, buff.length))) {sos.write(buff, 0, bytesRead);sos.flush();byteCount += bytesRead;} }sos.flush();if(log.isDebugEnabled()){log.debug("文件下载完成,文件大小:"+ byteCount +",总共用时:"+ (new Date().getTime() - timeStart) +"毫秒。");}} catch(IOException ioe) {ioe.printStackTrace();} finally {try {if(fis!=null){fis.close();}} catch (IOException e) {} finally {try {if(sos!=null){sos.close();}} catch (IOException e) {}}}}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">");out.println("<html>");out.println(" <head>");out.println("<title>文件下载</title>");out.println("<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />");out.println(" </head>");out.println(" <body>");out.print(" This is ");out.print(this.getClass().getName());out.println(", using the POST method");out.println(" </body>");out.println("</html>");out.flush();out.close();}private String getBrowser(HttpServletRequest request) {String userAgent = request.getHeader("USER-AGENT").toLowerCase();if (userAgent != null) {if (userAgent.indexOf("msie") >= 0) {return "IE";} else if (userAgent.indexOf("mozilla") >= 0) {return "FF";} else if (userAgent.indexOf("applewebkit") >= 0) {return "CH";} else if (userAgent.indexOf("safari") >= 0) {return "SF";} else if (userAgent.indexOf("opera") >= 0) {return "OP";}}return null;}}
希望本文所述对大家的JSP程序设计有所帮助。