【发布时间】:2015-01-07 00:25:15
【问题描述】:
我从 Spring Controller 下载文件时遇到一个非常奇怪的问题,首先是代码:
@RequestMapping(value = "/id/{fileId}", method = RequestMethod.GET)
public void getFile(@PathVariable("fileId") String fileId, HttpServletResponse response) {
// check if file exists
if (files.containsKey(fileId)) {
response.reset();
// StoredFile contains name, extension and content (byte[]) of the file
StoredFile file = files.remove(fileId);
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=" + file.getFullName());
byte[] payload = file.getContent();
response.setContentLength(payload.length);
// writing file on disk
File f = new File("/" + fileId + ".pdf");
try {
FileCopyUtils.copy(payload, f);
} catch (IOException e) {
e.printStackTrace();
}
// send the same payload to the client for download
try {
response.getOutputStream().write(payload);
} catch (IOException ex) {
throw new RuntimeException("IOError writing file to output stream");
}
}
}
所以,我检索了一个以前存储的文件,然后将其内容保存在磁盘上并将相同的内容发送到客户端进行下载,但奇怪的是:这两个文件不同!
保存的文件没问题(是jasper报告pdf)。
下载的文件什么都不显示,用二进制编辑器查看里面我发现了“EF BF BD”字节序列,它显示了一个 UTF-8 无法识别的字符。
我不明白我的byte[]的内容什么时候被解释为UTF-8,为什么插入字节序列;即使我在输出流中写入原始字节,我是否应该在某处设置编码?
我尝试将响应字符编码设置为不同的编码,结果没有变化,但我没有预料到任何变化,因为我没有传输文本......
有什么想法吗?
【问题讨论】:
-
我也尝试返回一个 ResponseEntity
但在最终下载的文件中出现相同的编码。谁能给我一个建议我应该去哪里看?
标签: java spring servlets encoding jasper-reports