我無法通過UTF-8文件名到move_uploaded_file()
,因爲它按字節順序轉換,導致文件系統中出現錯誤的名稱。例如:如何使用非ASCII文件名存儲上傳的文件?
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的錯誤:
File does not exist: […]/upload/\xc3\xa9.jpg.
什麼是正確的解決方案?如果我在Windows中重命名該文件(012.jpg),則編碼的HTML URI(%C3%A9.jpg)按預期工作。
關於這個問題的一些信息:http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
的Base64編碼由客戶端提供的文件名並用其作爲本地文件名? – larsks 2012-04-02 21:25:41
你需要維護上傳的文件名嗎?你能分配一個新的名字嗎? – Aerik 2012-04-02 21:45:48
@Aerik我這樣做,這就是問題的關鍵!在後來的項目中,我一定會使用嚴格的ASCII規則自動生成的文件名。 – 2012-04-02 22:32:04