[PHP] 使用 move_uploaded_file 上傳中文檔名的問題

在 PHP 中由網頁上傳檔案的功能,比起很多語法是簡單得太多了!但是如果用來上傳中文檔案名稱的檔案,許多人都會踢到鐵板。不是無法上傳,就上傳後檔名怪怪的。以下我們就針對這個問題來做一些研究。

PHP上傳中文檔案發生錯誤的原因在於中文版的伺服器若是使用 Big5 在編碼,而由網頁送過來資料卻是以 UTF8 來編碼,如此一來在接收時就會產生編碼的錯失,導致檔案上傳的失敗。我們建議您修改的方式,就是將接收到的檔名,由 UTF8 轉為 Big5 的編碼,最後再儲存即可。

說到 PHP 編碼的轉換,就不得不介紹 iconv 這個函數了,在 PHP5 之後這個函數已經內建在系統中。他的基本使用方式如下:

iconv( 原來的編碼 , 轉換的編碼 , 轉換的字串 )

例如我們要將 $tranString 這個變數的字串由 utf8 轉換為 big5 的編碼,方式如下:

iconv( "UTF-8" , "big5" , $tranString )

那回到我們的問題,這裡我們簡單做一個上傳的表單(upload.html)與上傳的程式(upload.php),等一下就是由上傳表單選好要上傳的檔案,再送到上傳的程式進行檔案上傳的動作:

首先是上傳的頁面:upload.html

<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="fileupload">檔案上傳</label>
<input id="fileupload" type="file" name="fileupload" />
<input id="button" type="submit" name="button" value="送出" />
</form>

特別要注意的是在這個表單中 必須要加上 enctype=”multipart/form-data” 把上傳的檔案編成表單的資料。

接著是處理上傳的程式:upload.php

<?php
$target_path = "uploadfiles/"; //指定上傳資料夾
$target_path .= $_FILES['fileField']['name']; //上傳檔案名稱

if(move_uploaded_file($_FILES['fileField']['tmp_name'],
iconv("UTF-8", "big5", $target_path ))) {
echo "檔案:". $_FILES['fileField']['name'] . " 上傳成功!";
} else{
echo "檔案上傳失敗,請再試一次!";
}
?>

您可以看到,在 move_upload_file 函數中,已經利用 iconv 將原來上傳檔案的名稱($target_path) 由 utf8 轉為 big5 了,如此在儲存時就能正確的儲存成中文檔名。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *