Java HttpServletResponse未覆盖我设置的参数
我有一个Java的web服务应用程序,我正在尝试使用导出功能将一些数据从数据库导出到excel文件 为此,我使用了HttpServletResponse,但即使我设置了文件名和编码类型,导出的文件也没有使用它们 我需要使用相应的导出日期和编码类型设置文件名,以允许使用UTF-8字符,如á、ó、ñ等-->这是固定的,请参见下面的编辑1 下面是我的代码:Java HttpServletResponse未覆盖我设置的参数,java,servlets,encoding,character-encoding,Java,Servlets,Encoding,Character Encoding,我有一个Java的web服务应用程序,我正在尝试使用导出功能将一些数据从数据库导出到excel文件 为此,我使用了HttpServletResponse,但即使我设置了文件名和编码类型,导出的文件也没有使用它们 我需要使用相应的导出日期和编码类型设置文件名,以允许使用UTF-8字符,如á、ó、ñ等-->这是固定的,请参见下面的编辑1 下面是我的代码: @RequestMapping(value = "/export", method = RequestMethod.GET) public
@RequestMapping(value = "/export", method = RequestMethod.GET)
public @ResponseBody
void export(HttpServletRequest request, HttpServletResponse r) {
Response response = new Response();
try {
response = service.export();
if(response.isSuccess()){
r.setHeader( "Content-Disposition","attachment; filename=export_20171216.xls");
r.setContentType("application/vnd.ms-excel");
r.setCharacterEncoding("UTF-8");
OutputStream out = r.getOutputStream();
byte[] buffer = new byte[4096];
int length;
while ((length = ((InputStream) response.getData()).read(buffer)) > 0){
out.write(buffer, 0, length);
}
out.flush();
out.close();
}
else{
r.sendError(801, response.toString());
}
} catch (Exception e) {
e.printStackTrace();;
}
}
因此,我得到的文件名是2ea4a24e-b0b4-4d50-9604-4fcdb3713b90.xls,文件中的单词是:Número而不是Número
---编辑1
在创建ByteArray时,我用下面的代码修复了重音元音
new ByteArrayInputStream(sb.toString().getBytes("ISO-8859-15"));
如果我没有弄错你的问题,你是在试图用必须编码的符号来保存文件名。根据setHeaders方法文档:
the header value If it contains octet string, it should be
* encoded according to RFC 2047
* (http://www.ietf.org/rfc/rfc2047.txt)
更可能的是,您的输入文件名是八位字节的ASCII格式。当您使用奇特的符号设置标题时,尝试使用java.nio.charset.CharsetDecoder
进行适当的解码
更多说明:ISO-8859-15不是Unicode格式,上面的任何符号都会导致对整个字符串进行HTTP属性编码。请尝试使用此方法:-我在代码中使用了此方法,它可以工作。。 如果问题仍然存在,请告诉我
public void downloadFile(String fileName, String paramName,
HttpServletResponse response) {
File fileToBeDownloaded = null;
InputStream fileInputStream = null;
ServletOutputStream servletOutputStream;
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
response.addHeader("Content-Disposition", "attachment; filename=" +
fileName);
servletOutputStream = response.getOutputStream();
IOUtil.copyCompletely(fileInputStream, servletOutputStream);
servletOutputStream.flush();
servletOutputStream.close();
}
您使用的浏览器和版本是什么?Chrome versionón 64.0.3282.186(Build of icial)(64位)我也尝试了Firefox,文件得到了另一个名称,比如随机名称,但格式与Chrome生成的不同
public void downloadFile(String fileName, String paramName,
HttpServletResponse response) {
File fileToBeDownloaded = null;
InputStream fileInputStream = null;
ServletOutputStream servletOutputStream;
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
response.addHeader("Content-Disposition", "attachment; filename=" +
fileName);
servletOutputStream = response.getOutputStream();
IOUtil.copyCompletely(fileInputStream, servletOutputStream);
servletOutputStream.flush();
servletOutputStream.close();
}