這幾天,在趕一個網頁的後台,由於案主要求的是中文檔案上傳,中文檔名下載...

因為big5並不是網路傳輸在使用上的統一標準,雖然說這種做法並不是最明智的...但是案主希望可以藉由這樣省去很多麻煩。

因為設計的系統單純屬於多檔傳輸(一次20個),他們希望以檔名做為前端list的title,所以在設計上多了很多問題。

點選檔案並且上傳、修改、刪除算是PHP理初階的課程,呼叫input標籤並設定type為file即可,但是問題在於後續的處理。

案主的伺服器環境並不是以往熟悉的LAMP( Linux + Apache + MySQL + PHP ),而是WSAMP( Windows Server + Apache + MySQL + PHP ),因此延生了一個問題,網頁傳來的資訊以及資料庫都是跑UTF8,但是Windows中文版的檔案管理卻是Big5編碼,這就造就了開發人員無力的現象。

整個後台設計過程,因為以前寫過類似的平台,所以功能性一直不是太大的問題,編碼的問題,讓我陷入了迴圈整整兩天...

我要符合的條件是:
   1. 中文(英文)檔名的檔案上傳
   2. 中文(英文)檔名自動擷取檔名並成為前端的title
   3. 中文(英文)檔名擷取後存在資料庫
   4. 下載連結可以正常的連到相對應檔名
   5. 可以正常刪除、修改檔名

以上的步驟,在處理非中文(英數命名)的檔案的話是非常簡單,不需要太注意編碼問題,但是中文加英文加數字...就沒想像中那麼容易了。

首先,要知道幾個相關的問題:
   1. 檔名在甚麼時候是Big5? 甚麼時候是UTF8?
   2. 在傳的過程甚麼時候為Big5? 甚麼時候是UTF8?
   3. 擷取出來甚麼時候是Big5? 甚麼時候是UTF8?

依照上面的問題,我先草草的設計了一下整個系統概略的架構,並且依照產生的問題進行修正。

最後抓到兩個訣竅:
   1. 中文檔案上傳到Windows Server須要先將檔名進行轉換。使用了mb_convert_encoding();這個函數進行UTF8轉Big5。
       
          $file_name = mb_convert_encoding($_FILES["file"]["name"], "big5", "utf8" );

      但是要切記,相對應存在資料庫的檔案location也是要轉換,否則會發生對應不了的現象。

   2. 另外,檔案在做超連結的時候,所對應到的是資料庫的location,所以在擷取的時候,需要在將抓出來的資料進行編碼反轉,這樣才可以順利的進行中文檔案下載。

這篇文章並不會提出核心的操作方式,只提到方法。因為系統的架構並不一樣,所以請各位看這篇的程式開發人員自行斟酌。

參考資料:
[1] PHP: mb_convert_encoding  - Manual
[2] PHP在Windows作業系統上傳中文檔名失敗的問題 - Anistar RIA Blog
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 YuRu 的頭像
    YuRu

    YuRu's Life

    YuRu 發表在 痞客邦 留言(0) 人氣()