2010-03-16 08:29:08 +00:00
< ? php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
2012-01-18 10:52:25 +08:00
2010-03-16 08:29:08 +00:00
/**
* External files API
*
2012-01-18 10:52:25 +08:00
* @ package core_files
* @ category external
* @ copyright 2010 Dongsheng Cai
2010-03-16 08:29:08 +00:00
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
require_once ( " $CFG->libdir /externallib.php " );
require_once ( " $CFG->libdir /filelib.php " );
2011-10-18 12:57:33 +08:00
/**
2012-01-18 10:52:25 +08:00
* Files external functions
*
* @ package core_files
* @ category external
* @ copyright 2011 Jerome Mouneyrac
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
* @ since Moodle 2.2
2011-10-18 12:57:33 +08:00
*/
class core_files_external extends external_api {
2010-03-16 08:29:08 +00:00
/**
* Returns description of get_files parameters
2012-01-18 10:52:25 +08:00
*
2010-03-16 08:29:08 +00:00
* @ return external_function_parameters
2012-01-18 10:52:25 +08:00
* @ since Moodle 2.2
2010-03-16 08:29:08 +00:00
*/
public static function get_files_parameters () {
return new external_function_parameters (
array (
2013-07-16 13:58:03 +08:00
'contextid' => new external_value ( PARAM_INT , 'context id Set to -1 to use contextlevel and instanceid.' ),
'component' => new external_value ( PARAM_TEXT , 'component' ),
'filearea' => new external_value ( PARAM_TEXT , 'file area' ),
'itemid' => new external_value ( PARAM_INT , 'associated id' ),
'filepath' => new external_value ( PARAM_PATH , 'file path' ),
2014-09-03 16:58:02 +02:00
'filename' => new external_value ( PARAM_TEXT , 'file name' ),
2013-07-16 13:58:03 +08:00
'modified' => new external_value ( PARAM_INT , 'timestamp to return files changed after this time.' , VALUE_DEFAULT , null ),
'contextlevel' => new external_value ( PARAM_ALPHA , 'The context level for the file location.' , VALUE_DEFAULT , null ),
'instanceid' => new external_value ( PARAM_INT , 'The instance id for where the file is located.' , VALUE_DEFAULT , null )
2010-03-16 08:29:08 +00:00
)
);
}
/**
* Return moodle files listing
2012-01-18 10:52:25 +08:00
*
* @ param int $contextid context id
* @ param int $component component
2013-06-21 11:51:02 +08:00
* @ param int $filearea file area
2012-01-18 10:52:25 +08:00
* @ param int $itemid item id
* @ param string $filepath file path
* @ param string $filename file name
2012-06-07 11:49:08 +08:00
* @ param int $modified timestamp to return files changed after this time .
2013-07-16 13:58:03 +08:00
* @ param string $contextlevel The context level for the file location .
* @ param int $instanceid The instance id for where the file is located .
2010-03-16 08:29:08 +00:00
* @ return array
2012-01-18 10:52:25 +08:00
* @ since Moodle 2.2
2010-03-16 08:29:08 +00:00
*/
2013-07-16 13:58:03 +08:00
public static function get_files ( $contextid , $component , $filearea , $itemid , $filepath , $filename , $modified = null ,
$contextlevel = null , $instanceid = null ) {
$parameters = array (
'contextid' => $contextid ,
'component' => $component ,
'filearea' => $filearea ,
'itemid' => $itemid ,
'filepath' => $filepath ,
'filename' => $filename ,
'modified' => $modified ,
'contextlevel' => $contextlevel ,
'instanceid' => $instanceid );
$fileinfo = self :: validate_parameters ( self :: get_files_parameters (), $parameters );
2010-07-03 13:37:13 +00:00
2010-07-09 08:57:03 +00:00
$browser = get_file_browser ();
2010-07-03 13:37:13 +00:00
2013-07-16 13:58:03 +08:00
// We need to preserve backwards compatibility. Zero will use the system context and minus one will
// use the addtional parameters to determine the context.
// TODO MDL-40489 get_context_from_params should handle this logic.
if ( $fileinfo [ 'contextid' ] == 0 ) {
$context = context_system :: instance ();
2010-07-03 13:37:13 +00:00
} else {
2013-07-16 13:58:03 +08:00
if ( $fileinfo [ 'contextid' ] == - 1 ) {
$fileinfo [ 'contextid' ] = null ;
}
$context = self :: get_context_from_params ( $fileinfo );
2010-07-03 13:37:13 +00:00
}
2013-07-16 13:58:03 +08:00
self :: validate_context ( $context );
2010-07-03 13:37:13 +00:00
if ( empty ( $fileinfo [ 'component' ])) {
$fileinfo [ 'component' ] = null ;
}
if ( empty ( $fileinfo [ 'filearea' ])) {
$fileinfo [ 'filearea' ] = null ;
}
2010-03-16 08:29:08 +00:00
if ( empty ( $fileinfo [ 'filename' ])) {
$fileinfo [ 'filename' ] = null ;
}
if ( empty ( $fileinfo [ 'filepath' ])) {
$fileinfo [ 'filepath' ] = null ;
}
2010-07-09 08:57:03 +00:00
$return = array ();
$return [ 'parents' ] = array ();
$return [ 'files' ] = array ();
2012-06-11 14:12:00 +08:00
$list = array ();
2013-07-16 16:01:00 +08:00
2012-06-05 13:42:30 +12:00
if ( $file = $browser -> get_file_info (
$context , $fileinfo [ 'component' ], $fileinfo [ 'filearea' ], $fileinfo [ 'itemid' ],
$fileinfo [ 'filepath' ], $fileinfo [ 'filename' ])) {
2010-07-09 08:57:03 +00:00
$level = $file -> get_parent ();
while ( $level ) {
$params = $level -> get_params ();
$params [ 'filename' ] = $level -> get_visible_name ();
array_unshift ( $return [ 'parents' ], $params );
$level = $level -> get_parent ();
}
$children = $file -> get_children ();
foreach ( $children as $child ) {
$params = $child -> get_params ();
2012-06-05 13:42:30 +12:00
$timemodified = $child -> get_timemodified ();
2010-07-09 08:57:03 +00:00
if ( $child -> is_directory ()) {
2012-06-07 11:49:08 +08:00
if (( is_null ( $modified )) or ( $modified < $timemodified )) {
2012-06-05 13:42:30 +12:00
$node = array (
'contextid' => $params [ 'contextid' ],
'component' => $params [ 'component' ],
'filearea' => $params [ 'filearea' ],
'itemid' => $params [ 'itemid' ],
'filepath' => $params [ 'filepath' ],
'filename' => $child -> get_visible_name (),
'url' => null ,
'isdir' => true ,
'timemodified' => $timemodified
);
$list [] = $node ;
}
2010-07-09 08:57:03 +00:00
} else {
2012-06-07 11:49:08 +08:00
if (( is_null ( $modified )) or ( $modified < $timemodified )) {
2012-06-05 13:42:30 +12:00
$node = array (
'contextid' => $params [ 'contextid' ],
'component' => $params [ 'component' ],
'filearea' => $params [ 'filearea' ],
'itemid' => $params [ 'itemid' ],
'filepath' => $params [ 'filepath' ],
'filename' => $child -> get_visible_name (),
'url' => $child -> get_url (),
'isdir' => false ,
'timemodified' => $timemodified
);
$list [] = $node ;
}
2010-03-16 08:29:08 +00:00
}
}
}
2010-07-09 08:57:03 +00:00
$return [ 'files' ] = $list ;
2010-03-16 08:29:08 +00:00
return $return ;
}
/**
* Returns description of get_files returns
2012-01-18 10:52:25 +08:00
*
* @ return external_single_structure
* @ since Moodle 2.2
2010-03-16 08:29:08 +00:00
*/
public static function get_files_returns () {
return new external_single_structure (
array (
'parents' => new external_multiple_structure (
new external_single_structure (
array (
'contextid' => new external_value ( PARAM_INT , '' ),
2011-09-24 15:07:27 +02:00
'component' => new external_value ( PARAM_COMPONENT , '' ),
'filearea' => new external_value ( PARAM_AREA , '' ),
2010-07-03 13:37:13 +00:00
'itemid' => new external_value ( PARAM_INT , '' ),
'filepath' => new external_value ( PARAM_TEXT , '' ),
'filename' => new external_value ( PARAM_TEXT , '' ),
2010-03-16 08:29:08 +00:00
)
)
),
'files' => new external_multiple_structure (
new external_single_structure (
array (
2010-07-03 13:37:13 +00:00
'contextid' => new external_value ( PARAM_INT , '' ),
2011-09-24 15:07:27 +02:00
'component' => new external_value ( PARAM_COMPONENT , '' ),
'filearea' => new external_value ( PARAM_AREA , '' ),
2010-03-16 08:29:08 +00:00
'itemid' => new external_value ( PARAM_INT , '' ),
2010-07-03 13:37:13 +00:00
'filepath' => new external_value ( PARAM_TEXT , '' ),
2014-09-03 16:58:02 +02:00
'filename' => new external_value ( PARAM_TEXT , '' ),
2010-03-16 08:29:08 +00:00
'isdir' => new external_value ( PARAM_BOOL , '' ),
'url' => new external_value ( PARAM_TEXT , '' ),
2012-06-05 13:42:30 +12:00
'timemodified' => new external_value ( PARAM_INT , '' ),
2010-03-16 08:29:08 +00:00
)
)
)
)
);
}
/**
* Returns description of upload parameters
2012-01-18 10:52:25 +08:00
*
2010-03-16 08:29:08 +00:00
* @ return external_function_parameters
2012-01-18 10:52:25 +08:00
* @ since Moodle 2.2
2010-03-16 08:29:08 +00:00
*/
public static function upload_parameters () {
return new external_function_parameters (
array (
2013-06-21 11:51:02 +08:00
'contextid' => new external_value ( PARAM_INT , 'context id' , VALUE_DEFAULT , null ),
2011-09-24 15:07:27 +02:00
'component' => new external_value ( PARAM_COMPONENT , 'component' ),
'filearea' => new external_value ( PARAM_AREA , 'file area' ),
2010-07-09 08:57:03 +00:00
'itemid' => new external_value ( PARAM_INT , 'associated id' ),
'filepath' => new external_value ( PARAM_PATH , 'file path' ),
'filename' => new external_value ( PARAM_FILE , 'file name' ),
2013-06-21 11:51:02 +08:00
'filecontent' => new external_value ( PARAM_TEXT , 'file content' ),
'contextlevel' => new external_value ( PARAM_ALPHA , ' The context level to put the file in ,
( block , course , coursecat , system , user , module ) ' , VALUE_DEFAULT , null ),
'instanceid' => new external_value ( PARAM_INT , ' The Instance id of item associated
with the context level ' , VALUE_DEFAULT , null )
2010-03-16 08:29:08 +00:00
)
);
}
/**
* Uploading a file to moodle
*
2013-06-21 11:51:02 +08:00
* @ param int $contextid context id
* @ param string $component component
* @ param string $filearea file area
* @ param int $itemid item id
* @ param string $filepath file path
* @ param string $filename file name
* @ param string $filecontent file content
* @ param string $contextlevel Context level ( block , course , coursecat , system , user or module )
* @ param int $instanceid Instance id of the item associated with the context level
2010-03-16 08:29:08 +00:00
* @ return array
2012-01-18 10:52:25 +08:00
* @ since Moodle 2.2
2010-03-16 08:29:08 +00:00
*/
2013-06-21 11:51:02 +08:00
public static function upload ( $contextid , $component , $filearea , $itemid , $filepath , $filename , $filecontent , $contextlevel , $instanceid ) {
2010-03-16 08:29:08 +00:00
global $USER , $CFG ;
2010-07-09 08:57:03 +00:00
2012-06-05 13:42:30 +12:00
$fileinfo = self :: validate_parameters ( self :: upload_parameters (), array (
2013-06-21 11:51:02 +08:00
'contextid' => $contextid , 'component' => $component , 'filearea' => $filearea , 'itemid' => $itemid ,
'filepath' => $filepath , 'filename' => $filename , 'filecontent' => $filecontent , 'contextlevel' => $contextlevel ,
'instanceid' => $instanceid ));
2010-03-16 08:29:08 +00:00
if ( ! isset ( $fileinfo [ 'filecontent' ])) {
throw new moodle_exception ( 'nofile' );
}
2012-06-05 13:42:30 +12:00
// Saving file.
2011-09-10 10:43:49 +02:00
$dir = make_temp_directory ( 'wsupload' );
2010-08-29 10:12:20 +00:00
2010-03-16 08:29:08 +00:00
if ( empty ( $fileinfo [ 'filename' ])) {
2011-09-10 12:06:59 +02:00
$filename = uniqid ( 'wsupload' , true ) . '_' . time () . '.tmp' ;
2010-03-16 08:29:08 +00:00
} else {
$filename = $fileinfo [ 'filename' ];
}
if ( file_exists ( $dir . $filename )) {
2010-07-09 08:57:03 +00:00
$savedfilepath = $dir . uniqid ( 'm' ) . $filename ;
} else {
$savedfilepath = $dir . $filename ;
2010-03-16 08:29:08 +00:00
}
file_put_contents ( $savedfilepath , base64_decode ( $fileinfo [ 'filecontent' ]));
2013-07-13 19:54:50 +02:00
@ chmod ( $savedfilepath , $CFG -> filepermissions );
2010-03-16 08:29:08 +00:00
unset ( $fileinfo [ 'filecontent' ]);
if ( ! empty ( $fileinfo [ 'filepath' ])) {
$filepath = $fileinfo [ 'filepath' ];
} else {
2010-07-09 08:57:03 +00:00
$filepath = '/' ;
2010-03-16 08:29:08 +00:00
}
2010-07-03 13:37:13 +00:00
2013-08-08 12:05:40 +08:00
// Only allow uploads to draft or private areas (private is deprecated but still supported)
if ( ! ( $fileinfo [ 'component' ] == 'user' and in_array ( $fileinfo [ 'filearea' ], array ( 'private' , 'draft' )))) {
throw new coding_exception ( 'File can be uploaded to user private or draft areas only' );
} else {
$component = 'user' ;
$filearea = $fileinfo [ 'filearea' ];
}
$itemid = 0 ;
2010-03-16 08:29:08 +00:00
if ( isset ( $fileinfo [ 'itemid' ])) {
2013-08-08 12:05:40 +08:00
$itemid = $fileinfo [ 'itemid' ];
}
if ( $filearea == 'draft' && $itemid <= 0 ) {
// Generate a draft area for the files.
$itemid = file_get_unused_draft_itemid ();
} else if ( $filearea == 'private' ) {
2012-06-05 13:42:30 +12:00
// TODO MDL-31116 in user private area, itemid is always 0.
2010-07-09 08:57:03 +00:00
$itemid = 0 ;
2010-03-16 08:29:08 +00:00
}
2010-07-09 08:57:03 +00:00
2013-06-21 11:51:02 +08:00
// We need to preserve backword compatibility. Context id is no more a required.
if ( empty ( $fileinfo [ 'contextid' ])) {
unset ( $fileinfo [ 'contextid' ]);
2010-03-16 08:29:08 +00:00
}
2013-06-21 11:51:02 +08:00
// Get and validate context.
$context = self :: get_context_from_params ( $fileinfo );
self :: validate_context ( $context );
2013-08-08 12:05:40 +08:00
if (( $fileinfo [ 'component' ] == 'user' and $fileinfo [ 'filearea' ] == 'private' )) {
2013-08-12 12:11:07 +12:00
debugging ( 'Uploading directly to user private files area is deprecated. Upload to a draft area and then move the files with core_user::add_user_private_files' );
2010-07-09 08:57:03 +00:00
}
2010-07-03 13:37:13 +00:00
2010-03-16 08:29:08 +00:00
$browser = get_file_browser ();
2012-06-05 13:42:30 +12:00
// Check existing file.
2010-07-09 08:57:03 +00:00
if ( $file = $browser -> get_file_info ( $context , $component , $filearea , $itemid , $filepath , $filename )) {
2010-03-16 08:29:08 +00:00
throw new moodle_exception ( 'fileexist' );
}
2012-06-05 13:42:30 +12:00
// Move file to filepool.
2010-07-09 08:57:03 +00:00
if ( $dir = $browser -> get_file_info ( $context , $component , $filearea , $itemid , $filepath , '.' )) {
$info = $dir -> create_file_from_pathname ( $filename , $savedfilepath );
$params = $info -> get_params ();
2010-03-16 08:29:08 +00:00
unlink ( $savedfilepath );
2010-07-09 08:57:03 +00:00
return array (
'contextid' => $params [ 'contextid' ],
'component' => $params [ 'component' ],
'filearea' => $params [ 'filearea' ],
'itemid' => $params [ 'itemid' ],
'filepath' => $params [ 'filepath' ],
'filename' => $params [ 'filename' ],
'url' => $info -> get_url ()
);
} else {
throw new moodle_exception ( 'nofile' );
2010-03-16 08:29:08 +00:00
}
}
/**
* Returns description of upload returns
2012-01-18 10:52:25 +08:00
*
* @ return external_single_structure
* @ since Moodle 2.2
2010-03-16 08:29:08 +00:00
*/
public static function upload_returns () {
return new external_single_structure (
array (
2010-07-09 08:57:03 +00:00
'contextid' => new external_value ( PARAM_INT , '' ),
2011-09-24 15:07:27 +02:00
'component' => new external_value ( PARAM_COMPONENT , '' ),
'filearea' => new external_value ( PARAM_AREA , '' ),
2010-07-09 08:57:03 +00:00
'itemid' => new external_value ( PARAM_INT , '' ),
2010-03-16 08:29:08 +00:00
'filepath' => new external_value ( PARAM_TEXT , '' ),
2010-07-09 08:57:03 +00:00
'filename' => new external_value ( PARAM_FILE , '' ),
'url' => new external_value ( PARAM_TEXT , '' ),
2010-03-16 08:29:08 +00:00
)
);
}
}
2011-10-18 12:57:33 +08:00
/**
2012-01-18 10:52:25 +08:00
* Deprecated files external functions
*
* @ package core_files
* @ copyright 2010 Dongsheng Cai
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
* @ since Moodle 2.0
* @ deprecated Moodle 2.2 MDL - 29106 - Please do not use this class any more .
* @ see core_files_external
2011-10-18 12:57:33 +08:00
*/
class moodle_file_external extends external_api {
/**
* Returns description of get_files parameters
2012-01-18 10:52:25 +08:00
*
2011-10-18 12:57:33 +08:00
* @ return external_function_parameters
2012-01-18 10:52:25 +08:00
* @ since Moodle 2.0
* @ deprecated Moodle 2.2 MDL - 29106 - Please do not call this function any more .
* @ see core_files_external :: get_files_parameters ()
2011-10-18 12:57:33 +08:00
*/
public static function get_files_parameters () {
return core_files_external :: get_files_parameters ();
}
/**
* Return moodle files listing
2012-01-18 10:52:25 +08:00
*
2011-10-18 12:57:33 +08:00
* @ param int $contextid
* @ param int $component
* @ param int $filearea
* @ param int $itemid
* @ param string $filepath
* @ param string $filename
* @ return array
2012-01-18 10:52:25 +08:00
* @ since Moodle 2.0
* @ deprecated Moodle 2.2 MDL - 29106 - Please do not call this function any more .
* @ see core_files_external :: get_files ()
2011-10-18 12:57:33 +08:00
*/
public static function get_files ( $contextid , $component , $filearea , $itemid , $filepath , $filename ) {
return core_files_external :: get_files ( $contextid , $component , $filearea , $itemid , $filepath , $filename );
}
/**
* Returns description of get_files returns
2012-01-18 10:52:25 +08:00
*
* @ return external_single_structure
* @ since Moodle 2.0
* @ deprecated Moodle 2.2 MDL - 29106 - Please do not call this function any more .
* @ see core_files_external :: get_files_returns ()
2011-10-18 12:57:33 +08:00
*/
public static function get_files_returns () {
return core_files_external :: get_files_returns ();
}
/**
* Returns description of upload parameters
2012-01-18 10:52:25 +08:00
*
2011-10-18 12:57:33 +08:00
* @ return external_function_parameters
2012-01-18 10:52:25 +08:00
* @ since Moodle 2.0
* @ deprecated Moodle 2.2 MDL - 29106 - Please do not call this function any more .
* @ see core_files_external :: upload_parameters ()
2011-10-18 12:57:33 +08:00
*/
public static function upload_parameters () {
return core_files_external :: upload_parameters ();
}
/**
* Uploading a file to moodle
2012-01-18 10:52:25 +08:00
*
2011-10-18 12:57:33 +08:00
* @ param int $contextid
* @ param string $component
* @ param string $filearea
* @ param int $itemid
* @ param string $filepath
* @ param string $filename
* @ param string $filecontent
* @ return array
2012-01-18 10:52:25 +08:00
* @ since Moodle 2.0
* @ deprecated Moodle 2.2 MDL - 29106 - Please do not call this function any more .
* @ see core_files_external :: upload ()
2011-10-18 12:57:33 +08:00
*/
public static function upload ( $contextid , $component , $filearea , $itemid , $filepath , $filename , $filecontent ) {
return core_files_external :: upload ( $contextid , $component , $filearea , $itemid , $filepath , $filename , $filecontent );
}
/**
* Returns description of upload returns
2012-01-18 10:52:25 +08:00
*
* @ return external_single_structure
* @ since Moodle 2.0
* @ deprecated Moodle 2.2 MDL - 29106 - Please do not call this function any more .
* @ see core_files_external :: upload_returns ()
2011-10-18 12:57:33 +08:00
*/
public static function upload_returns () {
return core_files_external :: upload_returns ();
}
}