网上有很多文件下载的实现,但很多都存在一些问题,我在写的时候也遇到了问题,如文件乱码,为防以后再犯所以就有了这篇文章,废话不说,直接贴码
servlet中
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = URLDecoder.decode(request.getParameter("fileName"), "UTF-8"); System.out.println(fileName); String filePath = FileUtil.UPLOAD_PATH + "\\" + fileName;//下载文件路径 if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) fileName = URLEncoder.encode(fileName, "UTF-8");//IE浏览器 else fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");//其它浏览器 File file = new File(filePath); if (file.exists()) { int fileLength = (int) file.length(); if (fileLength != 0) { response.reset(); response.setContentType("application/octet-stream"); response.setHeader("Content-disposition", "attachment;filename="+fileName); response.setContentLength(fileLength); InputStream is = new FileInputStream(filePath); byte[] buffer = new byte[1024]; ServletOutputStream fos = response.getOutputStream(); int len = 0; while ((len = is.read(buffer)) != -1) fos.write(buffer, 0, len); is.close(); fos.flush(); fos.close(); } } }jsp中
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>File down page</title> <script type="text/javascript"> function downfile(name) { // alert(name); /* var xmlhttp; if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest(); else xmlhttp = new ActiveXObject("MIcrosoft.XMLHTTP"); // xmlhttp = createRequestObject();//用此方法创建xmlHttpRequest,避免浏览器兼容问题 xmlhttp.open("GET", "DownLoadFile?fileName=" + encodeURI(encodeURI(name)), true); xmlhttp.send(); */ window.location.href="DownLoadFile?fileName=" + encodeURI(encodeURI(name)); } </script> </head> <body> <table width="100%" border="1"> <tr> <td width="60%" align="center">文件名称</td> <td width="40%" align="center">操作</td> </tr> <c:forEach items="${fileList}" var="f"> <tr> <td>${f }</td> <td> <input type="button" name="downfile" value="文件下载" onclick="downfile('${f}')"> </td> </tr> </c:forEach> </table> </body> </html>web.xml中
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>FileOperation</display-name> <!-- 文件下载 --> <servlet> <description></description> <display-name>DownLoadFile</display-name> <servlet-name>DownLoadFile</servlet-name> <servlet-class>com.dengsilinming.file.servlet.DownLoadFile</servlet-class> </servlet> <servlet-mapping> <servlet-name>DownLoadFile</servlet-name> <url-pattern>/DownLoadFile</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>文件下载时标题的乱码问题得到了解决,在IE、FireFox、Google Chrome中都已经测试过。