Moodle 中文 API 之 文件管理API
File API 文件管理
文件夹
1. 概述
2. 文件域
2.1 命名文件域
3. 提供文件给用户
4. 从用户那获取文件
5. 样例
5.1 浏览文件
5.2 移动文件
5.3 文件列表
5.4创建文件
5.5 读文件
5.6 删除文件
1. 概述
文件 API 是讲述在Moodle中的全部的文件存储. 假设你对文件怎样工作感兴趣,请到官网查看File API internals. 这篇文章不过告诉你知道怎样使用 file API.与之相关的是Repository API(让用户从moodle获取文件)
假设你想知道怎样管理文件在moodle 表单中, 你最好在去官网阅读 Using the File API in Moodle forms.
2. 文件域
文件被保存在file areas. 一个文件域被唯一定义通过例如以下:
· 一个 context id.
· 完整的component 名字 (使用 Frankenstyle), 比如 'course', 'mod_forum', 'mod_glossary', 'block_html'.
· 一个文件域类型(type), 比如 'intro' 或 'post'.
· 一个唯一的 itemid. 一般的, 这个 itemid 会依赖文件域类型. 比如, 对于 'course', 'intro' 文件域, 那么itemid 就是 0. 对于 forum post, 那就是它的 post id.
文件域并非分散的到处都是, 它们存储在 files 表里. 请注意每个子系统仅仅能訪问自己的文件域, 比如代码放在 /mod/assignment/* 仅仅能訪问component名为 'mod_assignment'.的文件。
2.1 命名文件域
文件域的名字不是严格定义的, 可是强烈推荐你使用具有标志意思的名字 如(intro, post, attachment, description, ...).
3. 提供文件给用户
你必须使用包括一个 file-serving 脚本的文件URL , 一般是 pluginfile.php. 比如:一般 URL 的形式像这样:
$url = $CFG->wwwroot/pluginfile.php/$contextid/$component/$filearea/arbitrary/extra/infomation.ext
特殊一点的可能像这样
$url = $CFG->wwwroot/pluginfile.php/$forumcontextid/mod_forum/post/$postid/image.jpg
通常你能够使用函数moodle_url::make_pluginfile_url()自己主动生成URL
$url = moodle_url::make_pluginfile_url($file->get_contextid(), $file->get_component(), $file->get_filearea(), $file->get_itemid(), $file->get_filepath(), $file->get_filename());
注意: 假设你不须要 'itemid', 请填入空他将会在 URL中被忽略 - 你必须提供它在提供提供文件的回调函数里.例如以下
文件服务脚本会查看context id, 和 component 名字, 以及 file area 名字和文件的分配及安全检查.
注意:非常多时候, 当开发第三方插件时, pluginfile.php 被看做是一个回调函数在合适的插件里. 这里函数存放在lib.php 文件中 且命名为 component_name_pluginfile().这些 arbitrary/extra/infomation.ext 是通过回调生成的. 比如, 文件存在 mod_forum+post 文件域(file area) 那么为他提供服务的是 mod_forum_pluginfile 函数 在 mod/forum/lib.php.这个函数在 MYPLUGIN/lib.php 中一般会成对出现像以下的样例, 详细訪问权限还要依赖插件所处的位置 (比如. assignment 文件仅仅能让老师訪问学生提交的文件, forum attachments 须要通过discussion 提交上来的文件):
function MYPLUGIN_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload, array $options=array()) {
// 检查上下文级别是否是期望的 - 假设你的插件是一个块, 它就会变成 CONTEXT_BLOCK, 等.
if ($context->contextlevel != CONTEXT_MODULE) {
return false;
}
// 确保 filearea 是插件中的一个.
if ($filearea !== 'expectedfilearea' && $filearea !== 'anotherexpectedfilearea') {
return false;
}
// 确保用户是登陆的且有訪问这个模块的权限 (插件不是课程模块的能够忽略'cm' 部分).
require_login($course, true, $cm);
// 检查相关权限- 这些可能依赖于 filearea 是否能被訪问.
if (!has_capability('mod/MYPLUGIN:view', $context)) {
return false;
}
// 假设你设置 itemid为空的话。就忽略以下这行, make_pluginfile_url (设置$itemid为0 取代).
$itemid = array_shift($args); // 參数数组中的第一个參数.
// 使用 itemid 不论什么相关的数据记录 和不论什么安全检查,假设用户的确有訪问权限
// 额外的 filename / filepath 来自參数数组.
$filename = array_pop($args); // 參数数组最后一个參数.
if (!$args) {
$filepath = '/'; // 參数为空时路径为 '/'
} else {
$filepath = '/'.implode('/', $args).'/'; // 參数包括文件路径的元素
}
// 从文件API中遍历文件元素.
$fs = get_file_storage();
$file = $fs->get_file($context->id, 'mod_MYPLUGIN', $filearea, $itemid, $filepath, $filename);
if (!$file) {
return false; // 这个文件不存在 }
// 我们如今发送文件给浏览者- 这会有一个环新村生命周期 1 天 且不会过滤.
// 从Moodle 2.3以后, 使用send_stored_file取代.
send_file($file, 86400, 0, $forcedownload, $options);
你常常会用一个 API 去自己主动生成URL, 常常file_rewrite_pluginfile_urls函数.
3. 从用户那获取文件
在官网上查看 Using the File API in Moodle forms
5. 样例
远离核心代码的开发并不真正使用文件API,而是使用formslib取代他们自己主动完毕.
5.1 浏览文件
$browser = get_file_browser();
$context = get_system_context();
$filearea = null;
$itemid = null;
$filename = null;
if ($fileinfo = $browser->get_file_info($context, $component, $filearea, $itemid, '/', $filename)) {
// 建立一个面包屑
$level = $fileinfo->get_parent();
while ($level) {
$path[] = array('name'=>$level->get_visible_name());
$level = $level->get_parent();
}
$path = array_reverse($path);
$children = $fileinfo->get_children();
foreach ($children as $child) {
if ($child->is_directory()) {
echo $child->get_visible_name();
// 显示 contextid, itemid, component, filepath 和 filename
var_dump($child->get_params());
}
}
}
5.2 移动文件
比如, 假设你只建立一个文件在暂时路径里
$from_zip_file = $CFG->dataroot . '/temp/backup/' . $preferences->backup_unique_code .
'/' . $preferences->backup_name;
并且你想将他移动到course_backup 文件域, 那么你须要需做
$context = get_context_instance(CONTEXT_COURSE, $preferences->backup_course);
$fs = get_file_storage();
$file_record = array('contextid'=>$context->id, 'component'=>'course', 'filearea'=>'backup',
'itemid'=>0, 'filepath'=>'/', 'filename'=>$preferences->backup_name,
'timecreated'=>time(), 'timemodified'=>time());
$fs->create_file_from_pathname($file_record, $from_zip_file);
5.3 文件列表
$fs = get_file_storage();
$files = $fs->get_area_files($contextid, 'mod_assignment', 'submission', $submission->id);
foreach ($files as $f) {
// $f 是stored_file的一个实例
echo $f->get_filename();
}
或者像链接...
$out = array();
$fs = get_file_storage();
$files = $fs->get_area_files($contextid, 'mod_assignment', 'submission', $submission->id);
foreach ($files as $file) {
$filename = $file->get_filename();
$url = moodle_url::make_file_url('/pluginfile.php', array($file->get_contextid(), 'mod_assignment', 'submission',
$file->get_itemid(), $file->get_filepath(), $filename));
$out[] = html_writer::link($url, $filename);
}
$br = html_writer::empty_tag('br');
return implode($br, $out);
5.4 创建文件
这儿介绍了怎样创建一个文本字符串文件. 相当于 PHP 函数file_put_contents.
$fs = get_file_storage();
// 准备文件记录对象
$fileinfo = array(
'contextid' => $context->id, // context的ID
'component' => 'mod_mymodule', // 模块名
'filearea' => 'myarea', // 文件域
'itemid' => 0, // usually = ID of row in table
'filepath' => '/', // 文件路径的開始和结束使用 /
'filename' => 'myfile.txt'); // 文件名称
// 创建包括文本'hello world'的文件
$fs->create_file_from_string($fileinfo, 'hello world');
假设你想创建一个文件在Moodle file area中基于一个真的文件。如.暂时的文件夹中,你能用create_file_from_pathname取代. 类似的,你能创建一个其它已经存在于 Moodle的本地文件通过使用 create_file_from_storedfile. 浏览通过lib/filestorage/file_storage.php 获取详细信息.
不同与普通文件, 这种方法不会自己主动重写一个存在的文件. 假设你希望重写一个文件, 你首先得获取这个文件删除它 (假设它存在的话),然后再次创建他.
5.5 读文件
这是读文件的一种方式, 等价于file_get_contents.请注意你只被同意訪问来自 mod/mymodule/* 模块的代码, 他是不能在其它不论什么地方訪问的. 其它代码不得不使用 file_browser接口取代.
$fs = get_file_storage();
// Prepare file record object
$fileinfo = array(
'component' => 'mod_mymodule', // usually = table name
'filearea' => 'myarea', // usually = table name
'itemid' => 0, // usually = ID of row in table
'contextid' => $context->id, // ID of context
'filepath' => '/', // any path beginning and ending in /
'filename' => 'myfile.txt'); // any filename
// 获取
$file = $fs->get_file($fileinfo['contextid'], $fileinfo['component'], $fileinfo['filearea'],
$fileinfo['itemid'], $fileinfo['filepath'], $fileinfo['filename']);
// 读取内容
if ($file) {
$contents = $file->get_content();
} else {
// 文件不存在时 代码
}
假设你想直接从硬盘訪问这个文件, 他是禁止的.你能够在暂时文件夹中得导一份拷贝.像这样 $file->copy_content_to($pathname),然后就能够訪问了.
5.6 删除文件
$fs = get_file_storage();
// 准备文件记录对象
$fileinfo = array(
'component' => 'mod_mymodule',
'filearea' => 'myarea', // usually = table name
'itemid' => 0, // usually = ID of row in table
'contextid' => $context->id, // ID of context
'filepath' => '/', // any path beginning and ending in /
'filename' => 'myfile.txt'); // 文件名称
// 获取文件
$file = $fs->get_file($fileinfo['contextid'], $fileinfo['component'], $fileinfo['filearea'],
$fileinfo['itemid'], $fileinfo['filepath'], $fileinfo['filename']);
// 假设存在删除它
if ($file) {
$file->delete();
}
Moodle 中文 API 之 文件管理API的更多相关文章
- moodle中文API之表单API
Form API 表单API 文件夹 1.概述 2.亮点 3.使用方法 4.表单元素 4.1 基本表单元素 4.2 定制表单元素 5.经常使用函数 5.1 add_action_buttons($c ...
- jQuery全屏滚动插件fullPage.js中文帮助文档API
jQuery全屏滚动插件fullPage.js中文帮助文档API 发现了一个fullPage.js插件,于是百度了一下,还就是这个插件的作用,其实有很多网站都做了全屏滚动的特效,效果也很好看,今天 ...
- day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能
目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...
- 用API网关把API管起来
最开始只是想找个API网关防止API被恶意请求,找了一圈发现基于Nginx的OpenResty(Lua语言)扩展模块Orange挺好(也找了Kong,但是感觉复杂了点没用),还偷懒用Vagrant结合 ...
- lumen 构建api(dingo api)
什么是 API API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力, ...
- ASP.NET Core Web API 开发-RESTful API实现
ASP.NET Core Web API 开发-RESTful API实现 REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representa ...
- 通过beego快速创建一个Restful风格API项目及API文档自动化
通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...
- HTML5之本地文件系统API - File System API
HTML5之本地文件系统API - File System API 新的HTML5标准给我们带来了大量的新特性和惊喜,例如,画图的画布Canvas,多媒体的audio和video等等.除了上面我们提到 ...
- 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作
原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...
随机推荐
- 学习中 常用到的string内置对象方法的总结
//concat() – 将两个或多个字符的文本组合起来,返回一个新的字符串. var str = "Hello"; var out = str.concat(" Wor ...
- BZOJ 1503 treap
思路: treap (算是基本操作吧-..) 加减的操作数很少 就暴力好啦 每回判断一下最小的数是不是比M小 如果是 就删,继续判断 搞定. //By SiriusRen #include <c ...
- 洛谷P4051 [JSOI2007]字符加密
题目描述 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法. 例如‘JSOI07’,可以读作 ...
- js 判断对touch事件支持
$.support = (function() { var support = { touch: !!(('ontouchstart' in window) || window.DocumentTou ...
- cd---切换工作目录
cd命令用来切换工作目录至dirname. 其中dirName表示法可为绝对路径或相对路径.若目录名称省略,则变换至使用者的home directory(也就是刚login时所在的目录).另外,~也表 ...
- 及格的产品vs优秀的产品
类似的产品,做了同样的一个功能,但是,我们还是可以很明显的感受到不同,这种不同我们常常把他叫做「用户体验」. 来看看2组类似产品相似功能的设计: 识别到歌名vs还可以滚动展示歌词 在很早的时候就存在一 ...
- JAVA学习第五十四课 — IO流(八)打印流 & 序列流
一.综合练习-文件清单列表 获取指定文件夹下,指定扩展名的文件(含子文件夹),并将这些文件的绝对路径写到一个文本文件里.也就是建立一个指定扩展名的文件列表 1.深度遍历 2.过滤器->容器 3. ...
- sdut 2805(最小生成树)
大家快来A水题 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 (1<= N <=2000)(1<= M <= N*(N-1)/2 ...
- [欧拉回路] poj 1386 Play on Words
题目链接: http://poj.org/problem?id=1386 Play on Words Time Limit: 1000MS Memory Limit: 10000K Total S ...
- Stacked Autoencoders
转自:http://www.cnblogs.com/tornadomeet/archive/2013/03/25/2980357.html 如果使用多层神经网络的话,那么将可以得到对输入更复杂的函数表 ...