使用REST服务core_files_upload将文件上载到Moodle

时间:2013-11-29 11:13:11

标签: php android web-services rest moodle

我正在开发一个Android应用程序,它将使用Moodle提供的REST webservice core_files_upload将内容上传到我的Moodle安装中的用户私有文件。 core_files_upload采用以下参数:

contextid
component
filearea
itemid
filepath
filename
filecontent

Moodle Web Services的文档不是很详细,所以我已经将我可以从Moodle论坛和Google搜索中拼凑出来,但我觉得我已经走到了尽头。从示例中我看到参数采用以下值:

contextid: int - not sure whether this is the userid
component: "user"
filearea: "private"
itemid: 0
filepath: "/"
filename: "filename.jpg"
filecontent: base64 encoding of file

我使用我的用户ID作为上下文 - 由于缺少文档,我确信这是否正确。当我发布这个时,我收到错误:

{"exception":"moodle_exception","errorcode":"nofile","message":"File not specified"}

我已经查看了“moodle / files / externallib.php”中定义了core_files_upload的位置,并且当filecontent不存在时会生成此错误消息。

我尝试过发布测试脚本,我可以基于base64编码在Moodle服务器上成功创建图像,例如:

<?php
file_put_contents('MyFile.jpg', base64_decode($_POST['filecontent']));

有人能说清楚为什么我没有成功上传到Moodle吗? contextid是用户进行上传的用户标识吗?

4 个答案:

答案 0 :(得分:4)

好的,所以经过一些进一步阅读和黑客攻击代码后,我可以确认上下文ID不是用户ID,而是从用户ID派生。我没有在Moodle中找到任何方法来获取上下文ID,所以我创建了自己的。一旦我获得了用户的上下文ID,上传就可以了。

define('AJAX_SCRIPT', true);
define('NO_MOODLE_COOKIES', true);

require_once(dirname(dirname(__FILE__)) . '/config.php');
require_once($CFG->dirroot . '/webservice/lib.php');

echo $OUTPUT->header();

// authenticate the user
$token = required_param('token', PARAM_ALPHANUM);
$webservicelib = new webservice();
$authenticationinfo = $webservicelib->authenticate_user($token);

// check the user can manage his own files (can upload)
$context = context_user::instance($USER->id);
$result = array("contextid"=>$context->id);
echo json_encode($result);

希望这可以帮助其他遇到同样问题的人。

答案 1 :(得分:2)

  • contextlevel:放入文件的上下文级别,(块,课程,coursecat,系统,用户,模块)

  • instanceid:与上下文级别关联的项目的实例ID

如果您指定contextlevel=user,那么instanceid必须是数据库中的用户ID。

答案 2 :(得分:1)

也许某人可以发布正确的解决方案。

我将使用Moodle的Webservice API(core_files_upload)和UserID作为参数。

$fileinfo = array(
'contextid' => null,
'component' => 'user',
'filearea' => 'draft',
'itemid' => 0,
'filepath' => '/',
'filename' => 'sample.txt',
'filecontent' => base64_encode("Hello Word!"),
'contextlevel' => 'user',
'instanceid' => $userid,
);

错误始终是&#34;文件未指定&#34; - Moodle将此文件上传到临时目录,但随后停止并回复错误消息

答案 3 :(得分:0)

在研究了moodle core_files_upload 函数三天后,我设法想出了这个最佳解决方案。希望这会在将来对某人有所帮助。

<?php
 $token = 'Put your token here';
 $domainname = 'Put your app url here';
 $restformat = 'json';
require_once('curl.php'); //Download this file
$curl = new curl;
$params = array(
    'component' => 'user',
    'filearea' => 'draft',
    'itemid' => 0,
    'filepath' => '/',
    'filename' => 'moodle.PNG',
    'filecontent' => base64_encode('/images/moodle.PNG'),
    'contextlevel' => 'user',
    'instanceid' => $userid,
);

/// UPLOAD IMAGE - Moodle 3.10+ and later
$functionname = 'core_files_upload';
$serverurl = $domainname .'/webservice/rest/server.php' . '?wstoken=' . $token .'&wsfunction=' . $functionname;

$restformat = ($restformat == 'json') ?
'&moodlewsrestformat=' . $restformat : '';
print_r($params);
printf("\n");
printf("\n");

$resp = $curl->post($serverurl . $restformat, $params);
$resps = json_decode($resp);

print_r($resps);
printf("\n");

还要检查这个https://moodle.org/mod/forum/discuss.php?d=275796 我已经测试过了,它按预期工作。