Java HttpServletResponse未覆盖我设置的参数

Java HttpServletResponse未覆盖我设置的参数,java,servlets,encoding,character-encoding,Java,Servlets,Encoding,Character Encoding,我有一个Java的web服务应用程序,我正在尝试使用导出功能将一些数据从数据库导出到excel文件 为此,我使用了HttpServletResponse,但即使我设置了文件名和编码类型,导出的文件也没有使用它们 我需要使用相应的导出日期和编码类型设置文件名,以允许使用UTF-8字符,如á、ó、ñ等-->这是固定的,请参见下面的编辑1 下面是我的代码: @RequestMapping(value = "/export", method = RequestMethod.GET) public

我有一个Java的web服务应用程序,我正在尝试使用导出功能将一些数据从数据库导出到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属性编码。

请尝试使用此方法:-我在代码中使用了此方法,它可以工作。。 如果问题仍然存在,请告诉我

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();
        }

您使用的浏览器和版本是什么?Chrome versionón 64.0.3282.186(Build of icial)(64位)我也尝试了Firefox,文件得到了另一个名称,比如随机名称,但格式与Chrome生成的不同
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();
        }