您在這裡

解決中文檔名上傳/下載會出現錯誤 的問題

cjh829's 的頭像
cjh829 在 2007-04-09 (週一) 16:22 發表

測試環境:
Ubuntu 6.10
apache2
php5
postgresql 8.1
Drupal 5.1

我不知道真正解決問題的key point在哪
但確實可以傳中文檔名,而且上傳到server上也是中文,下載也沒問題
先post整個過程,希望板上同好,在try的時候可以協助找出問題點

1.修正postgresql的client端語系

a.先確認資料庫的編碼為UTF8
b.修改資料庫的client端連結屬性
修改/etc/postgresql/8.1/main/postgresql.conf
加入下面這行
client_encoding = utf8
存檔後重新啟動postgresql

(註:mysql好像也有類似的設定,請自行詢問google大神囉)

做到這裡,上傳但還沒送出node前,會顯示正確的中文檔名(但送出後檔案名稱仍不正確)

2.修改drupal預設的檔案存取方式(這應該是問題所在)

修改drupal目錄下/includes/file.inc
找到所有用basename(xxx)包起來的函數
用底下這個函數取代
urldecode(basename(drupal_urlencode(xxx)))
(註:檔案內有一些變數也叫$basename,請一個一個看仔細,不要取代錯,做錯恕不負責XD)
存檔...完成!

然後就可以快樂的用中文檔名上傳了~
提供給各位參考...

如果只是單純的改 basename function 似乎不夠,
在 file_copy() 這個涵式裡面還有一些地方要改的, 主要是 $dest 要改成 UTF8 編碼,
使用的是 iconv("UTF-8","BIG-5",$dest使用的 ) 這個涵式
附上檔案給大家參考

目前測試過中文檔案上傳下載都沒有問題,
重覆上傳的檔名, 也會在結尾加上一個數字counter

請問
剛剛試了一下patch
環境:Windows Server 2003 SP2+Appserv 2.48(Apache:2.0.59 PHP:4.4.5)+Drupal 5.1
建立內容時 可以上傳中文檔名(看server上也是中文檔名)
但是點選連結時(看Firefox狀態列 檔案連結是http://ip/drupal/files/D:/www/drupal/files/%E5%80%8B%E4%BA%BA%E8%B3%87%E...)
路徑不對
會出現
Forbidden
You don't have permission to access /drupal/files/D:/www/drupal/files/個人資通安全保健手冊.pdf on this server.
但按右鍵鏈結另存新檔 可以存檔
似乎還是不行

我在linux的系統中測試仍有問題,確定是php的basename函數問題
php的版本為 5.2.0-8,我對include/file.inc做了個自訂的function
把原本的file.inc備份,下載本檔案之後覆蓋掉原本的就可以使用

--
from open mind to open source~

--
from open mind to open source~

我的使用經驗
在MS Windows以Xampp架設,中文檔名會出問題
在Linux上架設(Debian apt-get),中文檔名OK,我用使用網芳讀取網頁目錄,編碼也是OK的(UTF-8)
不過,我亂玩了幾個模組後,所有的字就變亂碼了,所以還是建議用英文檔名上傳,不然的話就是得小心模組的使用

cogito ergo sum 我思故我在

可以參考下面file.inc的修改方式, 測試過是OK的.
http://drupalchina.org/node/5292

file.inc修改兩個地方就可以

第一個地方,管DB文件名字的

原本是: $file->filename = file_munge_filename(trim(basename($_FILES['files']['name'][$source]), '.'), $extensions);

修改後:$file->filename = file_munge_filename(trim($_FILES['files']['name'][$source], '.'), $extensions);

第二個地方,管上傳到Server的文件名稱

原本是:if (!move_uploaded_file($_FILES['files']['tmp_name'][$source], $file->filepath))

修改後:if (!move_uploaded_file($_FILES['files']['tmp_name'][$source],iconv("UTF-8","BIG-5",$file->filepath)))

詢問"無法複製所選擇的檔案 ,因為沒有該名稱的檔名存在,請確認你提供的是正確的檔案名稱。"

我有測試兩台主機~一台改了上面的部份就不會秀上面的訊息,一台會…

因為主機語系嘛

心中常存善解、包容、感思、知足、惜福 (靜思語錄)

人人把心中的愛發揮出來,就能凝聚善的福業,形成善的循環。 (靜思語錄)

關於中文檔名上傳下載,我是參考版上的解決方法及

同樣我也出現刪除時無法刪除server的檔案

我有找到一個方法提供給各位參考嚕!如果在中文檔名上傳下載用的方法和我一樣刪除檔案的方法就是如下

(不同者不保證成功,也許可在相同位置程式碼上寫法作微調,請自行測試)

解決方法:
1.上傳下載中文檔名解決方法:

是採用j大的方法,引述如下:

第一個地方,管DB文件名字的

原本是: $file->filename = file_munge_filename(trim(basename($_FILES['files']['name'][$source]), '.'), $extensions);

修改後:$file->filename = file_munge_filename(trim($_FILES['files']['name'][$source], '.'), $extensions);

第二個地方,管上傳到Server的文件名稱

原本是:if (!move_uploaded_file($_FILES['files']['tmp_name'][$source], $file->filepath))

修改後:if (!move_uploaded_file($_FILES['files']['tmp_name'][$source],iconv("UTF-8","BIG-5",$file->filepath)))

如此,上傳下載為中文檔名沒有問題,但刪除案時,資料已刪除,但server端上的檔案依然存在,所以還要在一個地方修改一下

修改./modules/upload/upload.module 裡的

將原本file_delete($file->filepath);

皆改為file_delete(iconv("UTF-8","BIG-5",$file->filepath));

就可刪除server端的檔案

本人目前使用的版本為6.17

您好~~像可以del server端的資料是不是需使用upload模組所上傳的檔案才有效~
如果是使用cck 的 field_files上傳檔案而不是使用upload模組的就無效了?

心中常存善解、包容、感思、知足、惜福 (靜思語錄)

人人把心中的愛發揮出來,就能凝聚善的福業,形成善的循環。 (靜思語錄)

嗯~了解~~那我來找找…

還有我如果上傳的是全中文的話"無法複製所選擇的檔案 ,因為沒有該名稱的檔名存在,請確認你提供的是正確的檔案名稱。"會一直出現這訊息~
但如果檔案是數字和中文的檔名上傳檔案就不會出現上面的訊息~想詢問是什麼問題導致~謝謝

心中常存善解、包容、感思、知足、惜福 (靜思語錄)

人人把心中的愛發揮出來,就能凝聚善的福業,形成善的循環。 (靜思語錄)

所以在upload的function上傳的路徑也要更改語系,他才能辦識檔案,進而執行上傳動作

大致上要改的地方是upload(上傳的檔案檔名、及進到資料庫的路徑),unlink(刪除實體檔案)

不然原本是c:/drupal/你好.jpg在系統看來路徑都會變成c:/drupal/ (檔名變空白) 或 c:/drupa/□^&■ (亂碼狀態)

就會找不到檔案

而本來他就可以辨識英文和數字若你是中文數字混合他則會去掉中文(無法辦識的部份)留下數字如:
c:/drupal/你好123.jpg 上傳 他自動將檔名改成123.jpg,所以還是可以上傳但檔名就不是你原來的樣子

這是我用upload遇到的情形,在其他上傳模組應該也是差不多所以就針對我說的那幾個部份作修改看可不可以嚕

想詢問~想使用upload_ch
但找不到hom所說的

"所以另外開發用來作為計數器的 api 模組 => sequence"
不知是放那裡~能下載到呢~謝謝

心中常存善解、包容、感思、知足、惜福 (靜思語錄)

人人把心中的愛發揮出來,就能凝聚善的福業,形成善的循環。 (靜思語錄)

silaslin 您好~~謝謝你…

我有使用hom兄提供的。但是啊我下載檔案時,發現都只秀附檔名,而檔案名稱沒出來
而且上開始上傳上去有檔案完整名稱~後來變以上顯示
ttp://xxx.xxxcom.tw/web/file/download/43/.doc

在settings/upload_ch和settings/file-system我都設一樣的路徑~(沒有使用使用/結尾)

看file資料表中的filename和origname欄位~origname有記檔案名稱而filename只記到附檔名

心中常存善解、包容、感思、知足、惜福 (靜思語錄)

人人把心中的愛發揮出來,就能凝聚善的福業,形成善的循環。 (靜思語錄)