【发布时间】:2013-02-07 21:36:11
【问题描述】:
我的网站允许用户上传任何名称的文件。当然,有些名称将包含非 ASCII 字符。当用户上传文件时,我将其保存在具有原始名称的文件夹中。但是,当我尝试下载它时,通过访问它的位置(例如,files/Tolstoy - How much land does a man need?.pdf),我得到一个 404。有没有办法解决这个问题,使文件保持原来的名称?也许是通过 Apache?
【问题讨论】:
我的网站允许用户上传任何名称的文件。当然,有些名称将包含非 ASCII 字符。当用户上传文件时,我将其保存在具有原始名称的文件夹中。但是,当我尝试下载它时,通过访问它的位置(例如,files/Tolstoy - How much land does a man need?.pdf),我得到一个 404。有没有办法解决这个问题,使文件保持原来的名称?也许是通过 Apache?
【问题讨论】:
嗯,只是使用url编码,也称为percent encoding?这是为了处理 web.xml 中的 url。所有打印到 HTML 的 url 都应该是 url 编码的。
对于 PHP,应该使用 rawurlencode,因为它应该符合标准,而 urlencode 不符合。
编辑:针对这个问题
PHP 将“é”编码为“e%26%23769%3B”,而不是“e%CC%81”
e%CC%81 将是 é 的 UTF-8。 e%26%23769%3B 将用于é,它是相同的 HTML 实体。这意味着您要么在 urlencoding 之前在此处进行显式 htmlentities() 调用,要么您的服务器设置会自动执行此操作。如果有适当的字符集(实际上只需要 htmlspecialchars 调用),则不需要它,但它也不应该破坏任何东西。
如果您想测试这些在线工具:
【讨论】:
urlencode 也是我的第一个想法,但我无法让它发挥作用。这是我正在做的事情的链接,可能会有所帮助:filechan.net
解决方法:在上传时将文件名转换为 ASCII。你会很高兴的。
【讨论】:
好吧,出于某种我仍然不明白的原因,使用 rawurlencode() 而不是 urlencode() 使它工作。
但是,字符 é(我敢肯定)仍然被奇怪地编码(e%26%23769%3B 而不是简单的%C3%A9)。更奇怪的是包含它的链接可以工作。
【讨论】:
rawurlencode 解决了我的问题,所以这是真正帮助我的答案。不过经过一些修改,现在eis的答案更加准确和完整,所以我选择了它作为正确的答案。