測試環境:
windows7 php5.5.12 apache2.4.9
form表單
<form action="http://127.0.0.1/" method="post" enctype="multipart/form-data"> <input type="file" name="MAX_FILE_SIZE" value="1000000" /> <input type="submit" name="submit"> </form>
PHP處理代碼
if($_SERVER["REQUEST_METHOD"] == "POST"){ var_dump($_FILES); $info = pathinfo($_FILES["MAX_FILE_SIZE"]['name']); move_uploaded_file($_FILES["MAX_FILE_SIZE"]['tmp_name'],'fx\\'.$_FILES["MAX_FILE_SIZE"]['name']); exit(); }
測試一:
1、form表單文件 和 PHP文件均爲utf8編碼
2、選擇中文名稱文件提交上傳後,輸出$_FILES數組,文件名顯示正常
3、服務器磁盤文件名亂碼,文件內容正常
測試二:
1、更改form表單頁面編碼爲GBK PHP處理頁面代碼爲UTF8
2、選擇中文名稱文件上傳,輸出$_FILES數組,文件名亂碼
3、服務器磁盤文件名正常,文件內容正常
結論:
因目前只有window服務器環境,所以暫且在window環境下總結爲服務器在處理文件上傳時,無論頁面是何種編碼,可能因爲是windows服務器的原因,讀取上傳的文件名稱時始終採用的是gbk編碼,所以當提交頁面不是採用gbk編碼方式提交時,就會亂碼。解決方法爲:
1、保障提交頁面編碼和處理頁面編碼一致,纔不會導致處理頁面獲取到的信息亂碼
2、提交頁面編碼爲gbk則不會導致上傳到服務器的中文名文件文件名亂碼
3、若提交頁面不是GBK編碼,處理頁面在寫入文件時,應將文件名轉爲gbk編碼 iconv("提交頁面編碼","gbk",文件名)
4、因爲目前測試環境只有windows服務器,所以將亂碼的原因歸結爲服務器讀取文件名的編碼格式原因導致非gbk提交頁面文件名亂碼,若你有其他測試環境,麻煩幫忙測試 謝謝。