2014年8月15日 星期五

CCS fileupload 中文檔名檔案上傳下載的問題


CCS 內附有一個物件:FileUpload,可以用來處理檔案上傳的問題。可是,經過筆者實際使用過,發現就跟 php 一樣,中文檔名會有很大的問題。

html/php 中處理檔案上傳的程序是:

1.  html 的 <form ...><input type=file..> <input type=summit...>這是給使用者選擇上傳檔案的介面
2. 使用者選擇檔案後,瀏覽器傳回一個檔案格式回伺服器,放在一個伺服器指定的 tmp 目錄裡,副檔名應該是 .tmp 的。然後,這些檔案資訊就放在 $_FILE['file']陣列裡面(name, size, tmp_name..等)
3. 程式設計者必須再使用 move_uploaded_file() 將 tmp 檔案搬移到設計者指定的上傳目錄及檔案名稱。
4. 完成。

然而, CodeCharge的做法,基本上當然是循 html/php 的方式,但是,又稍微多此一舉一下。
CodeCharge 是這樣做的:
1. 在頁面上加入一個 FileUpload Control,自動產生需要的 html 以及相關的 Property、物件。
2. 只要填寫這個物件的屬性上去,就可以用了。包括:指定 temporary Folder , File Folder等。
3. 完成

這樣很簡單,對吧!這就是 CodeCharge  的優點。但是...

如果是英文檔名,這些都沒有問題。但中文檔名就有問題了!
主要的問題,還是在中文檔名無法經過 move_uploaded_file()
原本想說可以使用 Event 來攔截中文檔名,將之改為英數字檔名,然後中文檔名就記錄在資料庫中。
一直試了都失敗。 Before Process File / Before Show 兩個 EVENT 最有可能可以用,但是都不行!
後來,直接去研究  Code Charge 裡面 Class.php 關於 Fileupload 的程式碼發現,Code Charge 的處理,他是這樣的:

1. html/php 前端這裡跟前面一樣。
2. 使用者瀏覽了檔案,按了確定以後,CodeCharge 就直接處理到了自動加上一個日期時間序號的前置編碼在原檔名前面,然後就直接將 tmp move_uploaded_file 到 指定的 Temporary Folder,
3. 然後,再 MOVE 到 指定的 Folder 中
4. 所謂的 before process File,是指在這個 MOVE 之前的動作,而不是在 move_uploaded_file()之前。難怪不管我怎樣修改檔名為英數字都還是無效。

最後,我只好捨棄使用 CodeCharge的 FileUpload Control,而是直接寫 php 的程式!

Code Charge 的優勢還是在資料庫部分,Record / Grid / Editable Grid 等。

我就直接運用一個 Editable Grid 來顯示 上傳的檔案,加上聯結,當然使用者看到的是原始中文檔名,而實際上伺服器端放的是我修改過的英數字檔名,當使用者點擊該中文檔名的連結,就再呼叫 download.php 程式,將 英數字檔名,以及 原始中文檔名 傳給他,實際上傳的檔案是 後端的英數字檔案,而下載的檔案名稱去原始的中文檔名。

這樣問題就解決了。



沒有留言:

張貼留言

如何判斷現在FORM是在 insert mode? 還是 update mode?

只要用  if (empty({primary_key})) 就可以知道是否為新增模式了。 如果 {promary_key} 是空白的,那麼就是在新增模式;反之,就是更新模式。 以上。