繼上一篇「[鐵人賽Day3]PHP簡易檔案上傳實作&問題」,這次是要討論,假如用中文檔名上傳的話,是否可成功上傳?
假若依上一篇來測試的話,是不可上傳的
第一直覺就是編碼問題,查詢了一下相關的資料,原來是move_uploaded_file不能直接解析中文,再傳送前就會編譯成亂碼
(參考資料:http://injerry.pixnet.net/blog/post/27860604-%5Bphp%5Dmove_uploaded_file-utf-8-%E7%9A%84%E4%B8%AD%E6%96%87%E6%AA%94%E6%A1%88%E5%90%8D%E4%B8%8A%E5%82%B3%E5%95%8F%E9%A1%8C)
因此,把上篇的upload.php裡的一段
move_uploaded_file($_FILES['file']['tmp_name'], 'file/'.$_FILES["file"]["name"]);
改為
move_uploaded_file($_FILES['file']['tmp_name'], 'file/'.iconv('utf-8','big5', $_FILES["file"]["name"]));
程式內碼如下:
「upload.php」
(修正了檔案重複上傳,發出警告訊息、中文編碼以及增加副檔名顯示)
<title>File_Upload</title>
<meta http-equiv="content-type" charset="UTF-8"/>
<h1>檔案上傳</h1>
<?php
$file_name = iconv('utf-8','big5', $_FILES["file"]["name"]);
if($_FILES['file']['error']>0){
echo "檔案上傳失敗<br />";
echo "Error: " . $_FILES["file"]["error"];
}else if(file_exists("file/".$file_name)){
echo "檔案已存在,請勿重複上傳相同檔案";
}else{
move_uploaded_file($_FILES['file']['tmp_name'], 'file/'.$file_name);
echo "檔案連結:".'<a href="file/'.$_FILES['file']['name'].'">'.$_FILES["file"]["name"].'</a>';
echo "<br />";
echo "副檔名:".pathinfo('file/'.$_FILES['file']['name'], PATHINFO_EXTENSION)."<br />";
echo "類型:".$_FILES['file']['type']."<br />";
echo "大小:".iconv('utf-8','big5',(round($_FILES['file']['size']/1024,2)))."KB<br />";
}
?>