导出文件时,如果文件名是带中文,不同浏览器下会出现不同中文乱码问题。
以下代码,可解决IE、Edge、Chrome、Firefox浏览下导出中文文件名称的文件。 以便以后备用。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
/**
* @author: sunchangtan
* @date: 2018/6/26 12:29
* @description: Web导出文件工具类
*/
public class ExportUtils {
/**
* 导出文件
* @param request request
* @param response response
* @param fileNameToExport 文件名称
* @param exporter 实现导出方法的接口
* @throws IOException
*/
public static void export(HttpServletRequest request, HttpServletResponse response, String fileNameToExport, Exporter exporter) throws IOException {
String userAgent = request.getHeader("User-Agent");
// 针对IE或者以IE为内核的浏览器:
if (userAgent.contains("MSIE") || userAgent.contains("Trident") || userAgent.contains("Edge")) {
fileNameToExport = encode(fileNameToExport);
} else {
// 非IE浏览器的处理:
fileNameToExport = new String(fileNameToExport.getBytes("UTF-8"), "ISO-8859-1");
}
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileNameToExport));
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setCharacterEncoding("UTF-8");
OutputStream outputStream = response.getOutputStream();
if(exporter!=null) {
exporter.export(outputStream);
}
outputStream.flush();
outputStream.close();
}
public static String encode(String str) {
try {
return java.net.URLEncoder.encode(str, "UTF-8");
} catch (UnsupportedEncodingException e) {
}
return str;
}
public interface Exporter {
void export(OutputStream outputStream) throws IOException;
}
}