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

相关文章
相关标签/搜索