下载名称中包含非 ASCII 字符的文件


Download files with non-ASCII characters in the name

我的网站允许用户上传任何名称的文件。当然,有些名称将包含非 ASCII 字符。当用户上传文件时,我会将其保存在具有原始名称的文件夹中。但是,当我尝试通过访问其位置(例如,files/Tolstoy - How much land does a man need?.pdf(下载它时,我得到404。有没有办法解决这个问题,以便文件保持其原始名称?也许是通过阿帕奇?

,只使用 url 编码,也称为百分比编码? 这是为了处理网络中的网址。所有打印到 HTML 的网址都应进行网址编码。

对于 PHP,应该使用 rawurlencode,因为它应该符合标准,而 urlencode 则不是。

编辑:对于这个问题

PHP 将 "é" 编码为 "e%26%23769%3B",而不是 "e%CC%81">

e%CC%81将是 UTF-8 表示e%26%23769%3B将用于é,这是一个相同的HTML实体。这意味着你在urlencoding之前在那里执行显式htmlentities((调用,或者你的服务器设置会自动这样做。如果适当的字符集到位(实际上只需要htmlspecialchars调用(,则不是严格需要的,但它也不应该破坏任何东西。

如果您想测试这些内容,请提供一些在线工具:

  • http://htmlentities.net/来回测试转换 html 实体
  • http://www.hypergurl.com/urlencode.html 来回测试 URL 编码,同时使用 UTF-8 和 ASCII

解决办法:在上传时将文件名转换为 ASCII。你会很高兴的。

好吧,出于某种我仍然不明白的原因,使用 rawurlencode() 而不是 urlencode() 让它工作。

但是,字符é(我敢肯定(仍然被奇怪地编码(e%26%23769%3B而不是简单地%C3%A9(。更奇怪的是,包含它的链接有效。