在使用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。
前端代码:
window.open($.page.serviceSiteRootUrl + "download.srv?filePath=" + fileURL + "&fileName=" +encodeURI(fileName), "_blank");
注:** &fileName=" +encodeURI(fileName)** 其实出现中文乱码的问题不是出在后台,而是出现在前端js代码上,如果在get传参的过程中对于中文没有进行编码操作,中文乱码问题就会出现。
一般来说,解决乱码问题可以通过debug来分为从前到后,再从后到前的步骤来测试,可以用来确定是前端编码问题还是后端编码问题,便于解决。