我有一个Java的Web服务应用程序,我正在尝试执行导出功能,将一些数据从数据库导出到Excel文件
为此,我正在使用 HttpServletResponse ,但即使我设置了文件名和编码类型,导出的文件也没有使用它们。
我需要设置具有相应导出日期和编码类型的文件名,以允许 UT,ó,ñ等 UTF-8 字符 - >这已修复,请参阅下面的编辑1.
下面是我的代码:
@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"));
答案 0 :(得分:2)
如果我正确地解决了您的问题,您会尝试使用必须编码的符号来保存文件名。根据setHeaders方法docs:
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属性编码整个字符串。
答案 1 :(得分:1)
{{1}}
答案 2 :(得分:0)
请试试这个: - 我在我的代码中使用了它,它有效.. 如果问题仍然存在,请告诉我
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();
}