您在這裡

檔案上傳修改模組

hom's 的頭像
hom 在 2008-10-05 (周日) 17:34 發表

看到許多關於上傳中文檔名的討論
其實一直有一些想法

第一點是檔案下載的路徑
不要直接顯示真實路徑與檔名
而是某個開頭的路徑加上 file ID 作為參數
取得檔案資料後再用 header 送出下載
這樣下載路徑裡面就不會有出現中文檔名的問題

第二點是把上傳的檔名記在資料庫裡面
server 上實際存放的檔案則全部 rename 為 file ID
避免同檔名的檔案 以及中文檔名上傳變成亂碼檔名的檔案

第一點的部分做起來其實很簡單
在 hook_nodeapi 為 view 的時候
把 $node->content['files'] 呼叫的 theme 改成自訂的 theme
在 theme 裡面把下載路徑的輸出改成 $href = 'file/download/'.$file->fid;
然後用 hook_menu 寫一個路徑
再寫一個 callback 去依照路徑所帶的 fid 輸出檔案就行了

第二點就非常麻煩
這部分完全沒有 hook 可以使用
後來是透過 form_alter 修改上傳檔案呼叫的路徑改為自訂的路徑
callback 則是以 upload 為原本 然後稍作修改
在 _upload_prepare($node); 開始處理上傳檔案之前
先把上傳的檔名紀錄到資料庫內
然後上傳的檔名改為真實檔名的 id
在_upload_prepare($node); 處理完上傳檔案之後
再把 檔案類型和檔案描述 用真實檔名下去做修正

這邊先上傳目前的雛型
在 windows + xampp 環境下
資料庫編碼使用 utf8_general_ci
測試後可以上傳/下載中文檔名

linux 的部分現在手邊沒有環境可以測試 所以還不知道情況會是如何

之後預計再加上
自訂檔案下載路徑開頭的功能
可將 server 上的檔名使用 md5() 編碼
等功能

附加檔案大小
Package icon upload_ch.zip2.24 KB

試用報告
安裝upload_ch模組後
上傳中文檔名檔案
出現:選擇的檔案 D:\xampplite\tmp\tmpD650.tmp 無法被複製。
環境:win2003+xampplite+drupal 5.10