为什么我的byte []得到HttpServletResponse编码的UTF-8?

时间:2014-11-10 16:21:34

标签: java spring servlets encoding jasper-reports

从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以及插入字节序列的原因;我是否应该在某处设置编码,即使我在输出流中写入原始字节?

我尝试将响应字符编码设置为不同的编码而结果没有变化,但我没有预料到任何因为我没有传输文本......

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

代码有效! 一位同事下载了我的分支并运行了应用程序......下载的文件没问题。因此,我尝试将代码传递给另一位同事,然后将其部署到测试服务器上,始终获得积极的结果。 问题必须在某些工作空间或机器设置中,但肯定不在代码中。