在使用Plupload(前端上傳組件)+servlet 進行文件下載功能的時候(注:文件上傳實例) 出現下載到本地的文件,文件名亂碼的問題。解決方案以下: 後臺代碼:前端
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URL; import java.net.URLEncoder; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; /** * 文件在線查看及下載服務 * --------------------------------------------------------------------- * 日期 做者 操做類型 備註 * 2016-09-05 banyk 新建 * */ public class FileDownloadServlet extends HttpServlet { private static final long serialVersionUID = -7825355637448948579L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String isOnLine = request.getParameter("onLine"); String filePath = request.getParameter("filePath"); String fileName = request.getParameter("fileName"); String fileType = request.getParameter("fileType"); if(StringUtils.isNotBlank(fileType) && StringUtils.isNotBlank(filePath) && fileType.equals("xtwj")){ /*if (filePath.equals("jbqkDaTemplate")) { filePath = this.getClass().getClassLoader().getResource("/").getPath() + sc.getJbqkDaTemplatePath() + "/" + fileName; }else if(filePath.equals("jfpjTemplate")){ filePath = this.getClass().getClassLoader().getResource("/").getPath() + sc.getJfpjTemplatePath() + "/" + fileName; }*/ }else{ if(filePath==null || "".equals(filePath)){ response.sendError(404, "filePath is not fond!"); return; } } File file = new File(filePath); if(!file.exists()){ response.sendError(404, "File not fond!"); return; } BufferedInputStream br = new BufferedInputStream(new FileInputStream(file)); byte[] bs = new byte[1024]; int len = 0; response.reset(); // 很是重要 if (isOnLine != null && "onLine".equals(isOnLine)) { // 在線打開方式 URL u = new URL("file:///" + filePath); String contentType = u.openConnection().getContentType(); response.setContentType(contentType); response.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(fileName, "UTF-8")); } else { // 純下載方式 response.setContentType("application/x-msdownload;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8")); } response.setCharacterEncoding("UTF-8"); OutputStream out = response.getOutputStream(); while ((len = br.read(bs)) > 0) { out.write(bs, 0, len); } out.flush(); out.close(); br.close(); } @Override public void init(ServletConfig config) throws ServletException { super.init(config); } }
注: response.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(fileName, "UTF-8")); 在response設置Header的時候記得將其轉碼,設爲UTF-8。java
前端代碼:apache
window.open($.page.serviceSiteRootUrl + "download.srv?filePath=" + fileURL + "&fileName=" +encodeURI(fileName), "_blank");
注:** &fileName=" +encodeURI(fileName)** 其實出現中文亂碼的問題不是出在後臺,而是出如今前端js代碼上,若是在get傳參的過程當中對於中文沒有進行編碼操做,中文亂碼問題就會出現。後端
通常來講,解決亂碼問題能夠經過debug來分爲從前到後,再從後到前的步驟來測試,能夠用來肯定是前端編碼問題仍是後端編碼問題,便於解決。app