Java Chrome附加连字符“-&引用;下载到下载的CSV文件

Java Chrome附加连字符“-&引用;下载到下载的CSV文件,java,Java,我的代码适用于IE和FF。在Chrome中,浏览器在文件名的开头和结尾加上“-”连字符,因此无法识别文件类型。将文件另存为csv时重命名会使其在Excel中的单个单元格中打开,但我需要一个在代码端处理该文件的解决方案。这似乎很难 下面是我的代码: //fileName = xxxx.csv response.setContentType("application/download"); response.setHeader("Cache-Control", "public"); respons

我的代码适用于IE和FF。在Chrome中,浏览器在文件名的开头和结尾加上“-”连字符,因此无法识别文件类型。将文件另存为csv时重命名会使其在Excel中的单个单元格中打开,但我需要一个在代码端处理该文件的解决方案。这似乎很难

下面是我的代码:

//fileName = xxxx.csv
response.setContentType("application/download");
response.setHeader("Cache-Control", "public"); 
response.setHeader("Content-Type", "application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename= \"" + fileName + "\"");
注意:我搜索了很多博客,但没有找到Chrome的解决方案。

我看到两件事:

  • 内容配置中,
    文件名=
    后面不应该有空格
  • 我从未在文件名周围使用引号;我觉得你不该这么做。我看不到任何关于在中使用引号的内容,所以我会去掉它们
  • 我希望您看到的是连字符,因为Chrome正在用连字符替换空格或引号(更有可能),因为它认为引号对于操作系统上的文件名是无效字符

    FWIW,我的工作
    内容配置
    标题如下所示:

    Content-Disposition: attachment;filename=someFileName.csv 内容处置:附件;filename=someFileName.csv
    离题:您的陈述:

    我的代码适用于IE和FF。在Chrome中,浏览器在文件名的开头和结尾添加“-”hypen,从而使其无法识别文件类型


    浏览器应该(而且大多数情况下)通过MIME类型而不是文件扩展名来识别文件类型。您可能希望将
    内容类型
    设置为,而不是
    应用程序/octet流
    。(当然,如果你稍后谈论操作系统对文件的处理,那是另一回事。)

    这是Chrome的一个bug/功能

    看起来Chrome将引号视为文件名的一部分,但 意识到它们是文件名的有效字符,因此转换 将它们转换为连字符

    RFC2183定义了内容处置头,但没有说明内容处置头是什么 如果服务器将文件名括在引号中,则会发生这种情况

    (摘自第1条评论)


    必须从内容处置的文件名部分删除引号。我不确定没有引号的文件名中的空格会发生什么。这需要进行测试。

    尽管无效字符可能会导致这种情况,但这种尾随连字符文件名问题只会在与答案中列出的情况不同的情况下发生

    Long yesterday = new Date().getTime() - (1000*60*60*24);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    
    String theCsv = "stuff,stuff\n yeah, uhuh\n";
    
    //This sends a normal file
    Attachment att = new Attachment("myfile.csv", theCsv.getBytes(), "UTF-8");
    sendEmailWithAttachment("you@you.com","Me","me@me.com","Stuff for "+sdf.format(yesterday) ,"", att);
    
    //This sends one with a trailing hyphen!!
    String fileName = sdf.format(yesterday)+"-myfile.csv";
    fileName = fileName.replaceAll(" ", "").replaceAll("\"", "");
    Attachment att = new Attachment( fileName, theCsv.getBytes(), "UTF-8");
    sendEmailWithAttachment("you@you.com", "Me","me@me.com","Stuff for "+sdf.format(yesterday),"", att);
    
    我无法解释这一点。在我的例子中,问题不是引号或空格——唯一的区别是预解析的文件名。也许可以尝试一个没有字符串concats的文件名

    $response->sendHeaders();
    $response->sendContent();
    
    将上面的两行代码替换为下面的一行代码

    $response->send();
    

    它可能会起作用。

    您是否尝试过在文件名周围不加引号的方式?