主頁 > Drupal > Drupal 文件系統剖析(二)

Drupal 文件系統剖析(二)

PDF版本

前一篇我們分析了drupal的FileAPI和Stream Wrapper的關系,本文趁熱打鐵,繼續分析一下Drupal的Files系統,以便對Drupal的文件處理更加熟悉。
參考上篇:File System和Stream Wrapper的原理介紹

如何實現自有的StreamWrapper

看一個Drupal大學上的提問:《Drupal中如何實現自有的StreamWrapper》,通過上篇文章的閱讀,我們簡單總結一下。
1. 寫一個class,實現DrupalStreamWrapperInterface的接口
2. 實現一個hook,hook_stream_wrappers,返回這個StreamWrapper,通知給Drupal。
通過上面兩個簡單的步驟就實現了Drupal里面一個自有的streamWrapper。

Drupal如何調用StreamWrapper來存儲文件?

Drupal里面,所有的上傳文件的Field都是通過FileField實現(不一定絕對),FileField管理所有的文件,都記錄在Drupal的file_managed表里面,Drupal是通過File Entity來管理(沒有裝file_entity模塊也有這個entity),記錄所有的文件以及文件使用情況(file_usage表)。

我們可以看到file_managed表包含如下字段:
file_managed

Drupal的FileField字段有一個設置,可以選擇一個Upload destination,如下圖所示,

在這個列表里面,Drupal調用了hook_stream_wrappers,得到所有的streamwrapper,然后你指定一個streamwrapper,該FileField就是使用對應的streamwrapper來操作這里的文件。
(還有一種辦法,hook-form_alter,storageapi就是這么干的!)

字段的StreamWrapper修改之后怎么辦?

那么,問題來了。。。
如果我們在這個地方修改了StreamWrapper,之前的存儲的文件怎么處理?
通過查看file_managed表,我們可以知道,Drupal把存儲的所有文件到記錄到file_managed表,每一個文件都有一個url,這個URL是帶有scheme的(參見上篇),在對文件操作的時候,我們知道,文件系統會根據scheme獲取當前文件的StreamWrapper類,然后調用具體的StreamWrapper實例來操作這個文件。

也就是說,默認情況下,之前的文件如果你的StreamWrapper Class還能被加載(模塊沒有禁用),之前的文件還會保持在原有的地方,并且不會修改路徑。
而當前Content-Type的新添加的內容,會使用新的StreamWrapper,存儲新的URL到數據庫(帶有scheme)。
(ps:參考上圖中數據庫存儲的URL字段內容)

這個也適用于Field的存儲路徑有變化,比如之前文件路徑存儲在mydir1里面,我們設置后修改成mydir2/[date]之類的目錄,那么新的文件會變,舊的文件不會變。

問題:我想要原有的文件也修改一下路徑,把之前所有的文件都按照新的設置的路徑來存儲怎么辦???
答案:FileField_Paths模塊。

Drupal里面文件系統選擇文件Upload Destination是做什么的?

Drupal里面默認的文件系統,有一個Download Destination的選擇,這個是指定一個默認的destionation,再創建新的FileField的時候,默認選擇這個。
路徑是: /admin/config/media/file-system

Media模塊的作用?

Drupal里面默認有file entity,但是我們還是沒辦法簡單的給File Entity添加的類型(bundle),比如視頻、音頻、圖片、文檔等等,Drupal的三方模塊File Entity登場了,這個模塊擴展了之前的File實體,增加了更多的屬性,增加了對file的bundle的管理,使File真正成為一個可以管理的的Entity了。

從數據庫的角度來看,File Entity對Drupal的file_managed表進行了擴展,添加了一列type,來指定文件類型,如下圖所示:

file_entity

File Entity模塊是Media模塊的一部分,Media不僅通過FileEntity擴展了Drupal原有的File Entity,Media模塊也增加了對File Entity的管理,所有Drupal里面的Files(file_managed表)都能通過Drupal的后臺簡單的管理,使其界面可視化,更加方便,參考下圖:

media

另外,Drupal的Media模塊還增進了Drupal的upload系統,上傳圖片和media的時候,跟Wordpress的media類似,彈出一個對話框,可以上傳新的文件,也可以選擇之前的上傳的文件,便利性提高了不少,因此Media模塊還是值得一試!

Storage模塊

該模塊功能強大,對Drupal的存儲進行了擴展,方便管理,對于Storage模塊,筆者會專門寫一篇文件,分析一下Drupal的StorageAPI,以便將Drupal的存儲應用到更多的場景,敬請期待!

更多問題,請訪問Dupal大學,解決更多Drupal問題

相關閱讀:File System和Stream Wrapper的原理介紹

 


聲明: 本站所有文章歡迎轉載,所有文章未說明,均屬于原創,轉載均請注明出處。
本文有效鏈接: http://www.vczhtn.live/2015/06/drupal-file-system-media/
版權所有: Drupal與高性能網站架構 http://www.vczhtn.live


, , , ,

評論:2

發表評論
  1. avatar
    回復 美音婚禮?
    16/09/17

    drupal_http_request對streamwrapper支持有點問題,無論哪種scheme,只要接收到的content類型是chunked都無法正確處理。不知有沒解決辦法?

  2. avatar
    回復 美音婚禮?
    16/09/17

    查了下資料,原因是drupal_http_request不支持http 1.1, 解決辦法是使用php file_get_content 或者-curl。

發表評論

電子郵件地址不會被公開。 必填項已用 * 標注


2 + 三 =

您可以使用這些 HTML 標簽和屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

引用:0

下面所列的是引用到本博客的鏈接
Drupal 文件系統剖析(二) 來自 Drupal與高性能網站架構
頂部
安徽福彩15选5走势图