如何存储非ASCII文件名的上传文件?

时间:2012-04-02 21:20:54

标签: php windows apache url file-upload

我无法将 UTF-8 文件名传递给move_uploaded_file(),因为它按字节顺序转换,导致文件系统中出现错误名称。例如:

move_uploaded_file($_FILES['userfile']['tmp_name'], '\upload\é.jpg');

在上传目录中创建 xa9.jpg

虽然Windows API支持 UTF-16 ,但将此类文件名(例如iconv('UTF-8', 'UTF-16', 'é'))传递给move_uploaded_file()会导致错误。

百分比编码所有特殊字符是合理的,根据RFC 3986,我绝对应该对URI做同样的事情。但是当我使用百分比编码的URI时,Apache会给出404错误,因为它解码了URL并且找不到任何名称。

例如:<img src="/upload/%C3%A9.jpg" />给出了Apache错误:

  

文件不存在:[...] /upload/\xc3\xa9.jpg。

什么是正确的解决方案?如果我在Windows中重命名该文件(é.jpg),编码的HTML URI(%C3%A9.jpg )将按预期工作。


有关此主题的一些信息:http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php

1 个答案:

答案 0 :(得分:3)

iconv('UTF-8', 'Windows-1250', $_FILES['userfile']['name'])传递给move_uploaded_file()而不是使用UTF-16 ,并将HTML的文件名保存为rawurlencode($_FILES['userfile']['name'])

如果此文件名存储在数据库中,则任何文件请求都应引用iconv('UTF-8', 'Windows-1250', rawurldecode($filename))

我使用Windows-1250字符集,因为这是我系统的默认设置。

有关MSDN的其他信息: