【问题标题】:jsp safari browser windows file download content disposition file name became -jsp safari 浏览器 windows 文件下载内容配置文件名变成了-
【发布时间】:2017-06-21 06:50:56
【问题描述】:

以下代码用于下载附件编码中文字符为文件名。

w_inf_src = new File(p_filepath);
   w_inf = new FileInputStream(w_inf_src);
   p_response.setContentType(w_mime+";charset=UTF-8");
   p_response.setContentLength(new Long(w_inf_src.length()).intValue());
   p_response.setCharacterEncoding("UTF-8");
   p_request.setCharacterEncoding("UTF-8");

   p_response.setHeader("Content-disposition",
             "attachment;filename=\"" + (new java.net.URI(null, null, p_request, p_filename, null)).toASCIIString() + "\"");


   // Download File In Progress  
   w_outf = p_response.getOutputStream();
   w_bof = new BufferedOutputStream(w_outf);
   while ( (w_bytes_read = w_inf.read(w_buffer, 0, w_buffer.length)) != -1)
     w_bof.write(w_buffer, 0, w_bytes_read);      
   w_bof.flush();

我也尝试了文件名*=UTF-8'',但不起作用

【问题讨论】:

    标签: java jsp tomcat safari


    【解决方案1】:

    如果您至少使用 java 7 和 Sevlet API 3.0,则可以这样做:

    File w_inf_src = new File(p_filepath);
    String encoding = StandardCharsets.UTF_8.name();
    String w_disposition = String.format("%s;filename=\"%3$s\"; filename*=%2$s''%3$s",
        Part.ATTACHMENT,
        encoding,
        URLEncoder.encode(p_filename, encoding).replace("+", "%20"));
    
    p_response.setContentType(w_mime);
    p_response.setContentLengthLong(w_inf_src.length());
    p_response.setCharacterEncoding(encoding);
    p_response.setHeader("Content-Disposition", w_disposition);
    
    byte[] w_buffer = new byte[p_response.getBufferSize()];
    try(FileInputStream w_inf = new FileInputStream(w_inf_src);
        OutputStream w_outf = p_response.getOutputStream())
    {
        int n;
        while((n = w_inf.read(w_buffer)) != -1)
        {
            w_outf.write(w_buffer, 0, n);
        }
    }
    

    一些注意事项:

    1. 这是您将获得的最准确的配置形式,因为它是urlencoded空间消毒的。
    2. content-typecontent-encoding 中都设置编码是多余的
    3. 设置request编码是多余的:你没有在阅读。
    4. 使用BufferedInputStream 是多余的,因为响应具有内部缓冲
    5. 使用您自己的最大可用大小的缓冲区 (respose.getBufferSize())
    6. 尽可能使用try-with-resources(如果您使用的是 Java 7+)
    7. 如果你使用的是 Servlet API 3.0+,你有 response.setContentLengthLong(),他们终于明白整数是不够的
    8. 或者使用:response.setHeader("Content-Length", String.valueOf(w_inf_src.length()));:这样可以确保不会将大长度切割成 int 大小

    【讨论】:

    • 嗨,尝试使用此代码,但 safari 返回编码文件名 (%ee%...) 而不是文字汉字
    • 你试过其他浏览器吗?他们返回正确的文件名吗?
    • 其他浏览器工作正常,包括来自 mac 的 safari,但来自 windows 的 safari 仍然返回编码字符串
    • 这可能是 safari (windows) 问题。你可以做的很少,因为你控制着服务器端。您可以尝试的一件事是将 Windows 操作系统文件编码(欧洲默认为 CP1252 或 ISO-8859-1)更改为 UTF-8,希望 safari 会使用它。
    • 嗨,不知道如何更改 Windows 中的默认文件编码,但您是如何做到的?当我在网上搜索时,它只显示如何为记事本更改它,我认为如果无法完成,我们将放弃 windows safari 支持。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多