經驗交流

取得使用者上傳檔案的原始檔名

問題說明
 當我們設計一個可供使用者上傳檔案的介面時,如果需要取得其原始檔名的話,您得提防中文字裡頭的特殊字元。
 舉例來說,我們分別將兩個圖檔命名為「中山大學.jpg」與「成功大學.jpg」,再同時上傳;到了伺服器端時,您將會發現前者的原始檔名依然不變,而後者會變成「大學.jpg」。這是因為「成功大學.jpg」裡頭有個「功」字,而此字的後半字元為 ASCII 92(\)。一旦檔名中含有此一字元,PHP 將無法完整取得其原始檔名。
 怎麼辦呢?請參考以下這種處理方式。

我的做法
 原本我們會使用以下這種方式來接受使用者上傳檔案。
<form action="act.php" name="DemoForm" method="POST" enctype="multipart/form-data">
<input type="file" name="UserFile">
<input type="submit" value="Send File">
</form>

 現在,我們在其中多加一組隱藏的表單元件,並且在表單被傳送之前,利用 JavaScript 將原始檔名擷取下來另外存放。
<form action="act.php" name="DemoForm" method="POST" enctype="multipart/form-data" onsubmit="return Final_Check( );">
<input type="file" name="UserFile">
<input type="hidden" name="Original">
<input type="submit" value="Send File">
</form>

<script language="JavaScript">
function Final_Check( ) {
  var Ary = document.DemoForm.UserFile.value.split('\\');
  document.DemoForm.Original.value = Ary[Ary.length-1];
  return true;
}
</script>

 當檔案傳到伺服器端以後,您便可以改用 $_POST["Original"] 來取得原始檔名,以避免 $_FILES["UserFile"]["name"] 可能出錯的狀況。
 我將上述程式寫成以下的範例,您可以自行試用看看。

範例 原始碼
2004.7.27
經驗交流