概述
Moodle File API中介绍了Moodle管理文件的相关内容。如果你对该API的内部运行机制感兴趣,我们会在接下来的文档中介绍。本文档仅介绍File API的使用。和本API相关的还有Repository API,它介绍了用户如何从moodle中获取文件。
文件区
文件被存储在一个被称为文件区(File Areas)的结构中。一个文件由以下内容唯一标识:
- 上下文id(
context id
) - 完整的组件名(
component name
)(使用Frankenstyle,在之后的文档中会介绍),例如’course’, ‘mod_forum’, ‘mod_glossary’, ‘block_html’。 - 文件区类型(
file area type
),例如’intro’,’post’。 - 一个唯一的项目id(
itemid
),通常项目id和一些依赖于文件区类型的东西相关。
Moodle没有单独为文件区开辟空间来进行存储,它被隐式的存储在数据库的files表中。每一个子系统都只能访问它自己的文件区。例如,只有位于/mod/assignment/*
目录下的文件可以访问组件名为mod_assignment
的文件。
文件区的命名
Moodle对于文件区的命名规范并没有严格的定义,但是我们强烈推荐来使用常见的单数名词来为文件区命名。(intro, post, attachment, description, …)
向用户提供文件
在使用文件时,你必须提供包括文件服务脚本(file serving script)在内的文件url,文件服务脚本通常为pluginfile.php
。格式如下:
|
|
例如:
|
|
不过,一般来说你没有必要使用这种直接写出url的方式。Moodle提供了名为moodle_url::make_pluginfile_url()
的函数来获取文件的url。
|
|
注意:如果你不需要’itemid’,那么你需要给该参数传入null,此时在url中会忽略itemid的信息。在下面提到的回调函数中,你也需要注意这个问题。
文件服务脚本会根据相应的安全规范检查上下文id,组件名,文件区类型,并基于此提供文件服务。
注意:在多数情况下,开发者开发第三方你插件时,pluginfile.php会在合适的插件中寻找回调函数。这些函数定义在lib.php中,并且以
component_name_pluginfile()
的形式命名。arbitrary/extra/infomation.ext
会被传给回调函数。例如,位于mod_forum+post文件区的文件通过调用位于mod/forum/lib.php文件下的mod_forum_pluginfile()函数来提供文件服务。开发者的第三方插件中,MYPLUGIN/lib.php
文件下的相应函数应参照如下模式书写。当然,细节方面会由于相应插件的文件访问权限不同而有所区别。(例如,作业附件只能被教师访问,而学生只能提交文件。讨论区中的附件只有在打开相应的帖子时才能被访问)
|
|
你可以使用一个API函数来自动生成这些url,通常为file_rewrite_pluginfile_urls()
函数。
获取用户提交的文件
在之后的文档中会有介绍
代码范例
需要注意的是,开发者们在不触及到moodle核心的情况下,通常不会直接使用文件API,表单元素(formslib elements)会自动帮助开发者解决这些问题。
浏览文件
|
|
移动文件
例如,如果你刚刚用如下路径创建了一个文件
|
|
而你希望将它移动到course_backup文件区中,那么只需要
|
|
列出文件区的文件
|
|
或以链接的方式列出:
|
|
创建文件
下面给出了创建包含制定文本的文件的方式。这种方式和使用PHP函数file_put_contents
是等价的。
|
|
如果你想基于一个真实的文件在moodle系统中创建文件,你可以使用create_file_from_pathname()
函数。同样的,你也可以使用create_file_from_storedfile()
函数来创建已经存在于moodle本地文件中的文件。一些细节可以浏览lib/filestorage/file_storage.php
。
和普通方法不同,这种方法不会覆盖掉已经存在的文件,如果你希望覆盖掉它,你只有先将其删除(如果存在的话)再重新创建该文件。
读取文件
下面给出了一种读取文件的方式,这和file_get_contents()
函数是等价的。
注意:你只能在位于
mod/mymodule/*
目录下的代码中使用这种方法,其他代码中应使用file_browser
来读取文件。
|
|
你不能直接访问位于磁盘中的文件,而应在临时文件区中创建该文件的备份,之后再访问该文件。创建备份可以使用$file->copy_content_to($pathname)
。
删除文件
|
|