Java jsp safari浏览器windows文件下载内容配置文件名-

Java jsp safari浏览器windows文件下载内容配置文件名-,java,jsp,tomcat,safari,Java,Jsp,Tomcat,Safari,下面的代码用于下载附件,附件编码为文件名的汉字 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.setChar

下面的代码用于下载附件,附件编码为文件名的汉字

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 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);
    }
}
一些注意事项:

  • 这是您将获得的最准确的处置表单,因为它是URL编码的,并且经过空间清理
  • 在内容类型和内容编码中设置编码是多余的
  • 设置请求编码是多余的:您没有阅读
  • 使用
    BufferedInputStream
    是多余的,因为响应具有内部缓冲
  • 使用您自己的最大可用大小的缓冲区(
    respose.getBufferSize()
  • 在可能的情况下(如果您使用的是Java 7+),请使用
    try with resources
  • 如果您使用的是Servlet API 3.0+,那么您有
    response.setContentLengthLong()
    ,他们最终明白了整数是不够的
  • 或者使用:
    response.setHeader(“内容长度”,String.valueOf(w_inf_src.Length()):这确保了较大的长度不会切割成整数大小

  • 您好,已尝试使用此代码,但safari返回的是编码文件名(%ee%…)而不是文字汉字。是否尝试其他浏览器?他们返回正确的文件名吗?其他浏览器工作正常,包括mac的safari,但windows的safari返回编码字符串。这可能是safari(windows)的问题。由于您可以控制服务器端,所以您可以做的很少。您可以尝试将windows操作系统文件编码(欧洲默认为CP1252或ISO-8859-1)更改为UTF-8,希望safari会使用它。您好,不知道如何更改windows中的默认文件编码,但您是如何做到的?当我在网上搜索时,它只显示了如何将其更改为记事本,我想如果无法做到这一点,我们将放弃对WindowsSafari的支持。非常感谢你的帮助。