【问题标题】:Problem with downloading utf-8 encoded csv file using Spring boot and HttpServletResponse使用 Spring boot 和 HttpServletResponse 下载 utf-8 编码的 csv 文件的问题
【发布时间】:2020-05-24 08:38:32
【问题描述】:

我需要在我的 Spring Boot 应用程序中创建和下载一个 utf-8 编码的 csv 文件。 问题是 Excel 2019 无法正确打开它,您可能会猜到所有这些 utf-8 字符都显示为奇怪的符号。我在某处读到将 BOM 字符添加到 csv 文件的开头可以解决问题。我是手动完成的,它确实有效。但是,当我按如下方式使用 HttpServletResponse 时,它不起作用:

HttpServletResponse response = ...;//coming from rest api call
response.addHeader("Content-Type", "text/csv; charset=UTF-8");
response.addHeader("Content-Disposition", "attachment; filename=test.csv");
response.setCharacterEncoding("UTF-8");

/*write o response file csvWriter and flush/close it*/
try {
    ServletOutputStream outputStream = response.getOutputStream();
    outputStream.write(new byte[]{239, 187, 191});//add utf-8 BOM bytes
    outputStream.write("some,utf8,text".getBytes());
    outputStream.close();
} catch (IOException e) {
    //handle exception
}

我用一些 HEX 查看器工具检查了生成的 test.csv 文件,看看文件开头是否有那些 BOM 字节.很奇怪他们不在那里。尽管我明确地将它们写入文件,但它们并没有在文件开头写入。非常非常奇怪。 有人可以帮忙吗?!

【问题讨论】:

  • 你为什么不试试 outputStream.print 呢?不确定 BOM 字符的写入是否会从第一个字节开始并清除 response.getOutputStream()...
  • @JGFMK 我也尝试了打印方法,但得到了相同的行为。当我在写那些 BOM 字节之前写一些像“H”这样的 ascii 字符时,这变得更加奇怪。在这种情况下,我可以按照我编写它们的确切顺序在 HEX 查看器中查看它们。

标签: java spring-boot servlets utf-8 byte-order-mark


【解决方案1】:

我遇到了同样的问题,通过使用 CSV 格式的标题找到了解决方案:

CSVPrinter printer = new CSVPrinter(httpServletResponse.getWriter(), CSVFormat.EXCEL.withHeader("\ufeff");

我们仍然可以在字节顺序标记之后的头部添加其他字符串,它仍然有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 2021-03-09
    • 2014-08-31
    • 2011-08-04
    • 2011-11-02
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多