您在這裡

Upload_ch

hom's 的頭像
hom 在 2009-08-26 (三) 16:22 發表
模組介紹: 

解決中文檔名上傳/下載的問題

檔案上傳時,使用序列化數字作為檔名儲存實際檔案
並將中文檔名存入資料庫
於下載檔案時透過檔案ID對應,將下載的檔案重新命名回中文檔名
避免中文檔名在程式處理以及伺服器端儲存的問題
實體檔案位址將會在 files 資料夾內另開一個 node_attach 資料夾來存放,避免序列化的檔名與 files 內的檔案同名

另外
由於 6.x 取消 db_next_id() 函式
而代替的 db_last_insert_id() 函式實際上為抓取資料表欄位的 auto_increment 值
無法用來作為單純的計數器
所以另外開發用來作為計數器的 api 模組 => sequence
使用 upload_ch 模組時必須搭配 sequence

ps1. 僅修正內容(node)附加檔案的上傳與下載的中文檔名
ps2. 檔案下載設定新增選項,啟用後會在下載路徑尾端附加中文檔名,提高路徑的可讀性
ps3. 模組內已經附上翻譯檔
ps4. 下載時會將檔名編碼為 big5,所以多語環境下不適用,編碼可以在 variable 資料表設定 upload_ch_charset 的值來變更

模組分類:

模組版本:

回應

cck 的 file field 功能是獨立的
這部份需要另外改寫才行
我會找時間研究 file field 的程式
再來看要怎麼改寫

hi hom
謝謝你開發這個模組,超好用

不過,我遇到一個情況
啟用下載路徑尾端附加中文檔名
在 內容節點是正常的,下載時可以看到中文檔名
但是在Teaser view的模式下顯示附件檔案清單時,還是顯示數字ID,而非中文檔名
希望有機會能請你修補這個問題,超級感謝!!
我是用6.x版 win xp環境

感謝回覆

我是在content type的Attachments display中設定teaser view
設定如附檔

是用simple view產生的content list
網站網址 http://www.tpeea.org.tw 請參考最新消息的下載檔
看起來是中文檔名,點閱下載時跳出來的link是數字ID

非常棒的模組
而且也學到hook_menu_alter的用法與時機

另外,剛在測試此模組時,發現個小問題

部分檔案類型(txt、pdf)以及下載檔案時,出現下載視窗後再取消下載然後再點下載,都會被加入drupal_not_found()的內容
測試環境是 FF 3.5.5 與 IE8 皆在 Win 7,跑本機localhost
使用upload_ch-6.x-0.2-dev.zip版本

後來發現可能是upload_ch.module的79行,不管上方執行如何,皆會return drupal_not_found()
我將它修改為

78: }else{
79: return drupal_not_found();
80: }

就比較正常了,不曉得這樣的修正是否恰當..

剛看了原始upload模組中的file_download() 是沒有加入else{ .... }
而是在file_transfer()的最終加exit();
我想應該兩種都可以吧

前輩您好:我看到你這個模組出Drupal 6的版本了,所以就花了好幾天的時間去研究如何從D5升級到D6

目前是升級成功了,但出了一些問題,可能又要麻煩前輩你出手了 @@

圖片1:升級之後去點選升級之前所發的公告,其附件在下載時只會出現編號
圖片2:升級之後所發的測試公告,點選其附件一切正常

老樣子...IE 6 XP2

因為 5.x 和 6.x 在檔案資料儲存的處理上不太一樣
所以在資料庫儲存中文檔名的方式也跟著不同
目前 6.x 版的安裝檔裡面還沒有加上升級程式
所以並沒有把 5.x 版本的資料轉成 6.x 版本

以下先提供手動更新的方法
1. 開啟 phpmyadmin
2. 備份 files 資料表
註:如果 5.x 版上傳檔案很多,怕之後檢查時忘記
可以執行 SELECT * FROM files AS f INNER JOIN files_ch_name AS c ON f.filename = c.cnid SQL 指令把舊資料撈出來匯出
方便之後檢查時對照
3. 執行以下 SQL 語法
UPDATE files AS f INNER JOIN files_ch_name AS c ON f.filename = c.cnid SET f.filename = c.real_name
4. 檢查下載檔名是否正常
5. 如果下載檔名都正常了,就可以把舊版的資料表 files_ch_name 資料表移除

想詢問研究了一下upload模組的建立資料表的部份~然後有一問題~像upload所建立的fid欄位它並不是自動dauto_increment
想詢問它是根據去join files資料表中的fid嘛~

/**
* Implementation of hook_schema().
*/
function upload_schema() {
$schema['upload'] = array(
'description' => 'Stores uploaded file information and table associations.',
'fields' => array(
'fid' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'description' => 'Primary Key: The {files}.fid.',
),

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

你可以看到 upload.fid 的欄位說明:
'description' => 'Primary Key: The {files}.fid.',
也就是 fid 其實是對應 files.fid
在 files 資料表裡的 fid 才會 auto_increment
所以在 upload 資料表裡的 fid 當然不可能也用 auto_increment

嗯~所以其實像模組的一些關聯資料表等等~他會附上相關的欄位說明~
謝謝hom的說明

因為在想另外於別的系統中寫入資料到upload的資料表中~
但是發覺它的fid的部份是於file資料表中去auto_increment

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

各位大大:

請教一下,我安裝了upload_ch模組後,功能大致正常,唯獨上傳的txt檔案,下載下的檔案總是被加上一大段首頁的html碼....
如本來test.txt內容只有123.....下載時就變成123 加上首頁的html碼....我去Server查過files/node_attach 傳上去的檔案內容是對的(只有123),但傳下來就變成加上首頁html碼....
如果把upload_ch模組關掉,test.txt下載就正常了(內容只有123)......(可是我又需要使用upload_ch啊....)
請問有沒有人碰到跟我一樣的狀況呢?要如何處理呢?
我的drupal是6.16
server跑ubuntu9.04喔
煩請知情大大給我一點指示,謝謝啦........

應該跟上面 shime 所提到的狀況是一樣的吧
釋出修正過的版本 upload_ch-6.x-0.3-dev
換成新版本再試試看吧

詢問~上傳後中文附檔名不見了,然後下載時也看不到中文名稱的部份
http://drupaltaiwan.org/files/images02.PNG

並且有將hom大所提供的以下模組裝上來

sequence-6.x-0.1-dev.zip
upload_ch_itweak-6.x-0.1-dev.zip
upload_ch-6.x-0.3-dev.zip

然後ps4. 下載時會將檔名編碼為 big5,所以多語環境下不適用,編碼可以在 variable 資料表設定 upload_ch_charset 的值來變更
有去variable資料表看但沒看到upload_ch_charset這個欄位

我是貝努鳥,拉之心魂,引領前往杜埃(en:Duat)的諸神之嚮導。 (死者之書錄)

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

呼~找到原因~如果有使用FileField Paths的話要移掉哦~

我是貝努鳥,拉之心魂,引領前往杜埃(en:Duat)的諸神之嚮導。 (死者之書錄)

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