从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以及插入字节序列的原因;我是否应该在某处设置编码,即使我在输出流中写入原始字节?
我尝试将响应字符编码设置为不同的编码而结果没有变化,但我没有预料到任何因为我没有传输文本......
有什么想法吗?
答案 0 :(得分:0)
代码有效! 一位同事下载了我的分支并运行了应用程序......下载的文件没问题。因此,我尝试将代码传递给另一位同事,然后将其部署到测试服务器上,始终获得积极的结果。 问题必须在某些工作空间或机器设置中,但肯定不在代码中。