2012-04-02 160 views
3

我無法通過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

+0

的Base64編碼由客戶端提供的文件名並用其作爲本地文件名? – larsks 2012-04-02 21:25:41

+0

你需要維護上傳的文件名嗎?你能分配一個新的名字嗎? – Aerik 2012-04-02 21:45:48

+0

@Aerik我這樣做,這就是問題的關鍵!在後來的項目中,我一定會使用嚴格的ASCII規則自動生成的文件名。 – 2012-04-02 22:32:04

回答

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

附加信息:

相關問題