Drupal专业开发指南 第13章 Drupal文件(file)(2)

媒体处理

译者:老葛        Eskalate科技公司

文件API没有为上传文件提供一个通用的用户接口。为了为大多数用户填充这一空白,已将upload.module添加到了Drupal核心中,而且有多个第3方模块提供了可选方案。

上传模块(Upload Module)

上传模块为你选择的节点类型添加了一个上传字段。上传字段如图13-2所示。

Figure 13-2. 当启用了上传模块并且用户具有“upload files”权限时,在节点表单中添加了一个“文件附件(File attachments)”字段。

在节点编辑表单上一个文件被上传以后,upload.module将在节点主体下面添加已上传文件的下载链接。拥有“view uploaded files”权限的用户可以看到这些链接,如图13-3所示。

 

13-3. 使用核心上传模块为一节点上传文件后得到的链接列表视图。

 

 

 

这一通用解决方案可能不能满足所有用户的需求,所以在接下来的部分,让我们看一些更特殊的例子。

 

其它的通用文件处理模块

对于文件上传,可替代upload.module的模块有filemanager模块(http://drupal.org/project/filemanager)和attachment模块(http://drupal.org/project/attachment)。上传文件的另一选择是,使用CCK模块加上一个贡献的文件处理字段,比如imagefield 或 filefield。更多CCK字段类型可参看http://drupal.org/taxonomy/term/88

 

图片和相册(Images and Image Galleries)

需要创建一个相册?图片(image)模块(http://drupal.org/project/image)是个不错的选择。它能够处理图片的缩放和创建相册。当使用CCK在节点内部展示图片时,此时也有多个很好的解决方案。Imagecache (http://drupal.org/project/imagecache)能够处理创建图片分支(上传文件修改后的副本,比如一个缩略图(thumbnails)),而imagefield (http://drupal.org/project/imagefield)将在节点表单内部创建一个图片上传字段。

Video and Audio

视频和音频(Video and Audio)

视频模块(http://drupal.org/project/video)用来处理在节点内部上传和嵌入视频。音频模块(http://drupal.org/project/audio)用来处理上传音频,而且还可以使用一个嵌入的Flash播放器来播放音频。它也可以为podcasting生成RSS种子。

 

文件API

文件API还很年轻并有待修改,而且由于使用第三方模块可以完成大事多数文件处理功能,因此我们在这里就不详细讨论了,有兴趣的读者可以直接阅读API文档来学习它,文档的位于http://api.drupal.org/api/5/group/file

 

数据库Schema

尽管Drupal将文件存放在硬盘上,但它还是使用数据库存储了文件必要的元数据。除了上传者、MIME类型、位置,它还维护了上传文件的修订信息。下面是两个表的schema:

CREATE TABLE files (

fid int unsigned NOT NULL default 0,

nid int unsigned NOT NULL default 0,

filename varchar(255) NOT NULL default '',

filepath varchar(255) NOT NULL default '',

filemime varchar(255) NOT NULL default '',

filesize int unsigned NOT NULL default 0,

PRIMARY KEY (fid),

KEY nid (nid)

) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

CREATE TABLE file_revisions (

fid int unsigned NOT NULL default 0,

vid int unsigned NOT NULL default 0,

description varchar(255) NOT NULL default '',

list tinyint unsigned NOT NULL default 0,

PRIMARY KEY (fid, vid),

KEY (vid)

) /*!40100 DEFAULT CHARACTER SET UTF8 */

用于下载的认证钩子

模块开发者可以通过实现hook_file_download(),来设置私有文件下载的访问权限。该钩子用于决定满足什么条件才把文件发送给浏览器,并为Drupal返回额外的头部信息来追加到HTTP文件请求上。注意,如果你的Drupal使用的是公共文件下载设置的话,那么该钩子将不起任何作用。图13-4展示了下载流程的概貌,这里使用用户模块里面的hook_file_download()钩子实现作为例子。

由于Drupal在每次下载时,将调用所有实现了hook_file_download()钩子函数的模块,所以声明你钩子函数的适用范围就变得很重要了。例如,以user_file_download()为例,只有在要下载的文件位于图片目录时才对文件下载进行相应。如果位于图片目录中时,它将头部信息添加到请求中。

function user_file_download($file) {

$picture_path = variable_get('user_picture_path', 'pictures');

if (strpos($file, $picture_path .'/picture-') === 0) {

$info = image_get_info(file_create_path($file));

return array('Content-type: '. $info['mime_type']);

}

}

 

13-4。 似有文件下载请求的生命周期

 

如果请求被许可了,那么hook_file_download()钩子实现就应该返回头部信息,否则返回-1表示拒绝下载文件。如果没有模块相应这个钩子,那么Drupal将向浏览器返回一个404 Not Found错误信息。

总结

在本章你学到了

• 公共和私有文件的区别

• 使用第3方模块处理图片、视频、音频文件

• 用于文件存储的数据库schema

• 私有文件下载的认证钩子函数

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值