servlet下載文件名亂碼問題

在使用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

相關文章
相關標籤/搜索