【问题标题】:Why my byte[] gets UTF-8 encoded by HttpServletResponse?为什么我的 byte[] 得到 HttpServletResponse 编码的 UTF-8?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2019-03-31
    • 1970-01-01
    相关资源
    最近更新 更多