主页 > 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.drupal001.com/2015/06/drupal-file-system-media/
版权所有: Drupal与高性能网站架构 http://www.drupal001.com


, , , ,

评论: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与高性能网站架构
顶部