2007年10月24日 星期三

[PHP] 解決上傳中文檔名的偷雞摸狗之道

  今晚的時間,都被我拿來處理中文檔名上傳而消磨掉了,還蠻佩服自己能夠不屈不撓的(偶爾也要給自己讚美一下嘛),雖然其中有好幾次想要翻桌,不過幸好終於研究出方法,不然真不敢想像憤恨關掉電腦後的我會是什麼模樣(大爆走?也許都不用睡了…)。

  先是搜尋有關中文檔名上傳的資料,其中我試了 php + javascript 的方法( google 一下就可以知道是什麼方法囉),然而不知道是我沒有完全瞭解程式的意思還怎樣,無論怎麼試都不成功。就在我打算狠下心讓使用者無法以中文檔名上傳資料的時候,也許是廣大的使用者群眾默默給我集氣的關係,我突然靈光乍現!


  不知道這個方法有沒有人分享過了(我花了一整個晚上才想到,唉…):

  $filename = $_FILES['project']['name']; //取得上傳檔案的檔名
  $path = "../upload/";         //設定儲存上傳檔案的資料夾路徑
  if ( ! is_dir($path))           //檢查是否已有資料夾,若沒有,自動建立資料夾
  mkdir($path);
  list($firstname, $secondname) = explode(".", $filename);
  //$secondname為存取副檔名的變數
  $newname = $applyNo.".".$secondname; //以表單編號(一串數字)為新檔名
  // 將使用者上傳的檔案複製到對應的目錄
  copy($_FILES['project']['tmp_name'],$path.$newname);
  //原本應該是copy($_FILES['project']['tmp_name'],$path.$filename);

  總而言之,這個方法就是將使用者上傳以中文命名的資料,偷偷竄改成非中文的檔名,然後再存放到伺服器上。要先說明的是,我寫的網頁是一個申請表單,上傳檔案是必填欄位,而那個上傳檔案主要是給審核者看的。如果說,現在我要寫的是一個網路硬碟,使用者將資料上傳後,因為程式改掉了檔名…(可以想像是什麼情況吧 XD)這樣想起來,擅自竄改檔名還不是最佳解決之道呢。

  ps. 文末要好好謝謝網路上眾多喜歡分享的朋友,還有總是默默給我指導的 php 手冊 XD。

沒有留言: