HttpServletResponse没有覆盖我设置的参数

时间:2018-02-27 18:18:20

标签: java servlets encoding character-encoding

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

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

我需要设置具有相应导出日期和编码类型的文件名,以允许 UT,ó,ñ等 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"));

3 个答案:

答案 0 :(得分:2)

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

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属性编码整个字符串。

答案 1 :(得分:1)

{{1}}

答案 2 :(得分:0)

请试试这个: - 我在我的代码中使用了它,它有效.. 如果问题仍然存在,请告诉我

public void downloadFile(String fileName, String paramName, 
HttpServletResponse response) {
    File fileToBeDownloaded = null;
    InputStream fileInputStream = null;
    ServletOutputStream servletOutputStream;
    HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        response.addHeader("Content-Disposition", "attachment; filename=" + 
         fileName);
        servletOutputStream = response.getOutputStream();
        IOUtil.copyCompletely(fileInputStream, servletOutputStream);

        servletOutputStream.flush();
        servletOutputStream.close();
        }