You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
3.6 KiB
161 lines
3.6 KiB
<?php
|
|
/* For licensing terms, see /license.txt */
|
|
/**
|
|
* Document download/view script
|
|
* @package chamilo.document
|
|
*/
|
|
/**
|
|
* Init
|
|
*/
|
|
Use Model\Document;
|
|
Use Model\Course;
|
|
|
|
/**
|
|
* Return either
|
|
*
|
|
* - one document
|
|
* - several documents (file and/or folders) zipped together
|
|
*
|
|
* Used to transfer files to another application through http.
|
|
*
|
|
* Script parameters:
|
|
*
|
|
* - id id(s) of the document id=1 or id=1,2,4
|
|
* - cidReq course code
|
|
*
|
|
* Note this script enables key authentication so access with a key token is possible.
|
|
*
|
|
* @package chamilo.document
|
|
* @license see /license.txt
|
|
* @author Laurent Opprecht <laurent@opprecht.info> for the Univesity of Geneva
|
|
*/
|
|
require_once __DIR__ . '/../inc/autoload.inc.php';
|
|
KeyAuth::enable();
|
|
|
|
require_once __DIR__ . '/../inc/global.inc.php';
|
|
|
|
$has_access = api_protect_course_script();
|
|
if (!$has_access) {
|
|
exit;
|
|
}
|
|
|
|
session_cache_limiter('none');
|
|
|
|
$ids = Request::get('id', '');
|
|
$ids = $ids ? explode(',', $ids) : array();
|
|
|
|
$course = Course::current();
|
|
|
|
/**
|
|
* No files requested. We make sure we return 404 error to tell the client
|
|
* that the call failed.
|
|
*/
|
|
if (count($ids) == 0 || empty($course)) {
|
|
Response::not_found();
|
|
}
|
|
|
|
/**
|
|
* One file requested. In this case we return the file itself.
|
|
*/
|
|
if (count($ids) == 1) {
|
|
$id = reset($ids);
|
|
$doc = Document::get_by_id($course, $id);
|
|
if (empty($doc)) {
|
|
Response::not_found();
|
|
}
|
|
|
|
if ($doc->is_file()) {
|
|
$has_access = $doc->is_accessible();
|
|
if (!$has_access) {
|
|
Response::not_found();
|
|
}
|
|
|
|
event_download(Uri::here());
|
|
DocumentManager::file_send_for_download($doc);
|
|
exit;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Several files requested. In this case we zip them together.
|
|
*/
|
|
$files = array();
|
|
$folders = array();
|
|
foreach ($ids as $id) {
|
|
$doc = Document::get_by_id($course, $id);
|
|
if (!$doc->is_accessible()) {
|
|
break;
|
|
}
|
|
if ($doc->is_file()) {
|
|
$files[] = $doc;
|
|
}
|
|
if ($doc->is_folder()) {
|
|
$folders[] = $doc;
|
|
}
|
|
}
|
|
|
|
$requested_folders = $folders;
|
|
|
|
/**
|
|
* Note that if a parent folder is hidden children should not be accesible
|
|
* even if they are visible. It is therefore not sufficient to check document
|
|
* visibility.
|
|
*/
|
|
while ($folders) {
|
|
$items = $folders;
|
|
$folders = array();
|
|
foreach ($items as $item) {
|
|
$children = $item->get_children();
|
|
foreach ($children as $child) {
|
|
if (!$child->is_accessible()) {
|
|
break;
|
|
}
|
|
if ($child->is_file()) {
|
|
$files[] = $child;
|
|
}
|
|
if ($child->is_folder()) {
|
|
$folders[] = $child;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$folders = $requested_folders;
|
|
|
|
/**
|
|
* Requested files may not be accessible.
|
|
*/
|
|
if (count($files) == 0) {
|
|
Response::not_found();
|
|
}
|
|
|
|
$root_dir = '';
|
|
$items = array_merge($folders, $files);
|
|
foreach ($items as $item) {
|
|
$path = $item->get_absolute_path();
|
|
$path = realpath($path);
|
|
$dir = dirname($path);
|
|
|
|
if (empty($root_dir) || strlen($root_dir) > strlen($dir)) {
|
|
$root_dir = $dir;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Zip files together.
|
|
*/
|
|
$temp_zip_path = Chamilo::temp_file('zip');
|
|
$zip_folder = new PclZip($temp_zip_path);
|
|
foreach ($files as $file) {
|
|
if (empty($root_dir)) {
|
|
$root_dir = dirname($file);
|
|
}
|
|
$file = (string) $file;
|
|
$zip_folder->add($file, PCLZIP_OPT_REMOVE_PATH, $root_dir);
|
|
}
|
|
|
|
/**
|
|
* Send file for download
|
|
*/
|
|
event_download(Uri::here());
|
|
DocumentManager::file_send_for_download($temp_zip_path, false, get_lang('Documents') . '.zip');
|
|
|