java - HttpServletResponse 没有覆盖我设置的参数

标签 java servlets encoding character-encoding

我有一个 Java 网络服务应用程序,我正在尝试执行导出功能以将一些数据从数据库导出到 excel 文件

为此,我使用了 HttpServletResponse,但即使我设置了文件名和编码类型,导出的文件也没有使用它们。

我需要使用相应的导出日期和编码类型设置文件名,以允许 UTF-8 字符,如 á、ó、ñ 等 --> 这是固定的,请参阅下面的编辑 1。

下面是我的代码:

@RequestMapping(value = "/export", method = RequestMethod.GET)
    public @ResponseBody
    void export(HttpServletRequest request, HttpServletResponse r) {
        Response response = new Response();
        try {
            response = service.export();
            if(response.isSuccess()){
                r.setHeader( "Content-Disposition","attachment; filename=export_20171216.xls");
                r.setContentType("application/vnd.ms-excel");
                r.setCharacterEncoding("UTF-8");
                OutputStream out = r.getOutputStream();
                byte[] buffer = new byte[4096];
                int length;
                while ((length = ((InputStream) response.getData()).read(buffer)) > 0){
                    out.write(buffer, 0, length);
                }
                out.flush();
                out.close();
            }
            else{
                r.sendError(801, response.toString());
            }
        } catch (Exception e) {
            e.printStackTrace();;
        }
    }

结果,我得到的文件名称类似于 2ea4a24e-b0b4-4d50-9604-4fcdb3713b90.xls,文件中的字样如下:Nömero 而不是 Número

--- 编辑 1 我在创建 ByteArray 时使用以下代码修复了重音元音

new ByteArrayInputStream(sb.toString().getBytes("ISO-8859-15"));

最佳答案

如果我正确地解决了您的问题,那么您正在尝试使用必须编码的符号来保留文件名。根据 setHeaders 方法文档:

the header value If it contains octet string, it should be
     *            encoded according to RFC 2047
     *            (http://www.ietf.org/rfc/rfc2047.txt) 

更有可能您的输入文件名是八位字节的 ASCII 格式。当你用你喜欢的符号设置标题时,尝试使用 java.nio.charset.CharsetDecoder 进行适当的解码。

多一点解释:ISO-8859-15 不是 Unicode 格式,它上面的任何符号都会导致对 HTTP 属性的整个字符串进行编码。

关于java - HttpServletResponse 没有覆盖我设置的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49015392/

相关文章:

java - 在 Netbeans 中构建项目时出错

java - 在java中运行时编译jasperreport子报表

java - 如何在几周内停止或崩溃 Android 应用程序?

java - doPost 是否加密 URL 及其外部附加参数

java - RESTful 应用程序编辑未反射(reflect)在 tomcat 上

java - 没有 JSF 的 Facelets

java - org.apache.commons.fileupload.servlet.ServletFileUpload 似乎没有方法 setProgressListener

encoding - Erlang 和西里尔字母的 URL 编码

PHP 导出带有 BOM 的 CSV UTF-8 不起作用

python - 在 python 文件中指定编码时,python 中的 "magic lines(s)"如何工作?