当前位置: 首页 > 面试题库 >

Java servlet下载文件名特殊字符

司雅畅
2023-03-14
问题内容

我正在编写一个简单的文件下载servlet,但无法获取正确的文件名。尝试使用URLEncoding和MimeEncoding在现有答案中看到的文件名,但没有一个起作用。

以下代码段中的fileData对象包含mime类型,byte []内容和文件名,它们至少需要ISO-8859-2字符集,而ISO-8859-1不够。

如何使我的浏览器正确显示下载的文件名?

这是文件名的示例:árvíztűrőtükörfúrógép.xls,结果为:árvíztqrptükörfúrógép.xls

  protected void renderMergedOutputModel(Map model, HttpServletRequest req, HttpServletResponse res) throws Exception {

    RateDocument fileData = (RateDocument) model.get("command.retval");
    OutputStream out = res.getOutputStream();
    if(fileData != null) {
        res.setContentType(fileData.getMime());
        String enc = "utf-8"; //tried also: ISO-8859-2

        String encodedFileName = fileData.getName();
            // also tried URLencoding and mime encoding this filename without success

        res.setCharacterEncoding(enc); //tried with and without this
        res.setHeader("Content-Disposition", "attachment; filename=" + encodedFileName);
        res.setContentLength(fileData.getBody().length);
        out.write(fileData.getBody());
    } else {
        res.setContentType("text/html");
        out.write("<html><head></head><body>Error downloading file</body></html>"
                .getBytes(res.getCharacterEncoding()));
    }
    out.flush();
  }

问题答案:

我发现了可以在我安装的所有浏览器(IE8,FF16,Opera12,Chrome22)中使用的解决方案
这是基于以下事实:如果未指定[不同]编码,则浏览器期望使用filenames参数的值,该参数以浏览器的本机编码进行编码。

通常,浏览器的本机编码为utf-8(FireFox,Opera,Chrome)。但是IE的本机编码是Win-1250。

因此,如果我们根据用户的浏览器将值放入由utf-8 / win-1250编码的文件名参数中,它应该可以工作。至少,它对我有用。

String fileName = "árvíztűrőtükörfúrógép.xls";

String userAgent = request.getHeader("user-agent");
boolean isInternetExplorer = (userAgent.indexOf("MSIE") > -1);

try {
    byte[] fileNameBytes = fileName.getBytes((isInternetExplorer) ? ("windows-1250") : ("utf-8"));
    String dispositionFileName = "";
    for (byte b: fileNameBytes) dispositionFileName += (char)(b & 0xff);

    String disposition = "attachment; filename=\"" + dispositionFileName + "\"";
    response.setHeader("Content-disposition", disposition);
} catch(UnsupportedEncodingException ence) {
    // ... handle exception ...
}

当然,仅在上述浏览器上对此进行了测试,我不能保证100%可以一直在任何浏览器中使用。

注意#1(@fallen)
:使用URLEncoder.encode()方法不正确。尽管有方法的名称,但它并未将字符串编码为URL编码,但确实将其编码为表单编码。(格式编码与URL编码非常相似,在很多情况下,它产生相同的结果。但是存在一些差异。例如,空格字符“”被编码为不同:“
+”而不是“%20”))

对于正确的URL编码字符串,您应该使用URI类:

URI uri = new URI(null, null, "árvíztűrőtükörfúrógép.xls", null);
System.out.println(uri.toASCIIString());


 类似资料:
  • 我在从AWS下载上面的文件时遇到了一些麻烦。我试图用CouldBerry Explore和Java下载这个文件,但失败了。aws文档说我需要特殊的处理。(https://docs.aws.amazon.com/amazons3/latest/dev/usingmetadata.html)那么,你能告诉我如何用“:”下载这个文件吗? 以下是我的文件信息。 文件名:“E:\home\temp\test

  • 问题内容: 我试图编写一个文件名带有特殊字符的文件,例如“téééê.mp3”,但文件名始终保留“?” 我尝试了几种方法来代替字符“é”,但没有找到解决方法: 我也尝试过这种方式。 问题答案: 尝试: 现在,如果这是您的文件系统不支持此类文件名的问题,您将得到一个;。不同于,新的API拒绝创建可能最终无法读取的文件名。 如果确实无法创建路径,那么,您将必须找到某种逃避和撤消逃避的方法。也许写一个别

  • 本文向大家介绍JavaServlet的文件上传和下载实现方法,包括了JavaServlet的文件上传和下载实现方法的使用技巧和注意事项,需要的朋友参考一下 先分析一下上传文件的流程 1-先通过前段页面中的选择文件选择要上传的图片 index.jsp 2-点击提交按钮,通过ajax的文件上传访问服务器端 common.js   3-服务器端响应保存或者下载 保存上传文件的FileUpload.jav

  • 我有一个问题,下载文件有特殊字符在它像"ñ"或"的"。 我正在对每个文件名应用rawurlencode()。但是当我走上这条路线时,apache正在重写我的url。 当我检查a标签中的href时,我得到了正确的URL编码路由,如下图所示。 带有编码url的标记 但是当我点击链接时,编码的数据丢失了 点击链接后丢失编码 这里是我的apache配置

  • 我必须使用exe来运行某个函数。但是该目录包含某些具有特殊字符的文件夹,比如“.”,“-”,所以它不会被执行。我可以像重命名文件名一样重命名目录名吗?我不确定需要做什么。 我使用Linux环境。下面是一段代码, 有人能建议我吗?谢谢

  • 问题内容: 我试图用来从一些.csv文件中获取数据。只要文件名或文件路径中没有重音(例如ä,é,ü),此方法就可以正常工作。当我使用诸如这样的文件名时,出现以下错误:。我的代码是: 我正在使用pandas 0.20.1和python 3.6.0。我发现这在以前的版本中是一个问题,但我认为它已解决。有想法该怎么解决这个吗?我也发现了这个:https : //github.com/pandas- de