2013-11-29 3 views
2

Я разрабатываю приложение для Android, которое будет загружать контент в личные файлы пользователя в моей установке Moodle с использованием веб-службы REST core_files_upload, предоставляемой Moodle. core_files_upload принимает следующие параметры:Загрузка файла в Moodle с помощью службы REST core_files_upload

contextid 
component 
filearea 
itemid 
filepath 
filename 
filecontent 

Документация для веб-служб Moodle не очень подробно, поэтому я кусочкам, что я могу на форумах 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 

Я использую свой идентификатор пользователя, как ContextID - Я usnsure ли это правильно из-за отсутствия документации. Когда я после этого я receieve ошибку:

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

Я смотрел на то, где core_files_upload определен в «MOODLE/файлов/externallib.php», и это сообщение об ошибке генерируется, когда filecontent нет.

Я попытался размещения на тестовый сценарий, и я могу успешно создать образ на сервере Moodle на основе кодирования base64, например:

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

Может кто-нибудь пролить свет на то, почему я быть неудачная загрузка в Moodle ?
Является ли contextid идентификатором пользователя, выполняющим загрузку?

ответ

3

Итак, после некоторого дополнительного чтения и взлома с кодом я могу подтвердить, что идентификатор контекста не является идентификатором пользователя, а выводится из идентификатора пользователя. Я не нашел никакого способа в Moodle, чтобы получить идентификатор контекста, поэтому я создал свой собственный. Как только у меня был идентификатор контекста для пользователя, загрузка работала.

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
  • contextlevel: Уровень контекста поместить файл в, (блок, конечно, coursecat, система, пользователь, модуль)

  • instanceid: идентификатор экземпляра элемента, связанного с уровнем контекста

Если вы укажете contextlevel=user, тогда instanceid должен быть идентификатором пользователя в БД.

0

Возможно, кто-то опубликует правильное решение.

Я буду использовать API-интерфейс Webservice (core_files_upload) из Moodle и UserID в качестве параметра.

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

Ошибка когда-либо «файл не указан» - Мудл загрузить этот файл во временную директорию, но потом остановился и ответ с сообщением об ошибке

Смежные вопросы