<?php /** * VFM - veno file manager: chunk.php * * Resumable uploads * * PHP version >= 5.3 * * @category PHP * @package VenoFileManager * @author Nicola Franchini <support@veno.it> * @copyright 2013 Nicola Franchini * @license Exclusively sold on CodeCanyon * @link http://filemanager.veno.it/ */ require_once dirname(__DIR__).'/class/class.setup.php'; require_once dirname(__DIR__).'/class/class.gatekeeper.php'; require_once dirname(__DIR__).'/class/class.actions.php'; require_once dirname(__DIR__).'/class/class.location.php'; require_once dirname(__DIR__).'/class/class.utils.php'; require_once dirname(__DIR__).'/class/class.template.php'; require_once dirname(__DIR__).'/class/class.logger.php'; require_once dirname(__DIR__).'/class/class.uploader.php'; $uploader = new Uploader(); $setUp = new SetUp(); $getloc = filter_input(INPUT_GET, 'loc', FILTER_SANITIZE_SPECIAL_CHARS); $starttrim = ltrim($setUp->getConfig('starting_dir'), './'); $getloc = $getloc ? ltrim(urldecode(base64_decode($getloc)), './') : false; if ($getloc && mb_substr($getloc, 0, mb_strlen($starttrim)) == $starttrim) { $getloc = mb_substr($getloc, mb_strlen($starttrim)); } else { $getloc = ''; } $getlocfull = str_replace('\\', '/', dirname(dirname(__DIR__))).'/'.$starttrim.$getloc; if (!is_dir($getlocfull)) { $message = '<span><i class="bi bi-exclamation-triangle"></i> '.$setUp->getLangString('upload_not_allowed').'</span> '; Utils::setError($message); exit; } $logloc = './'.$starttrim.$getloc; $location = new Location('../../'.$starttrim.$getloc); $gateKeeper = new GateKeeper(); if ($gateKeeper->isAccessAllowed() && ($gateKeeper->isAllowed('upload_enable')) && $location->editAllowed('../../')) { if ($_SERVER['REQUEST_METHOD'] === 'GET') { $resumabledata = $uploader->setupFilename($_GET['resumableFilename']); $resumableFilename = $resumabledata['filename']; $extension = $resumabledata['extension']; $basename = $resumabledata['basename']; $relative_path = rtrim($_GET['resumableRelativePath'], $_GET['resumableFilename']); $getlocfull .= $relative_path; if (!is_dir($getlocfull)) { if ($gateKeeper->isAllowed('newdir_enable')) { mkdir($getlocfull, 0755, true); // Create subfolders } else { Utils::setError($setUp->getLangString('not_allowed')); header("HTTP/1.0 200 Ok"); exit; } } $fullfilepath = $getlocfull.$resumableFilename; // Skip invalid file if (!$uploader->veryFile($fullfilepath, $_GET['resumableTotalSize'])) { header("HTTP/1.0 200 Ok"); exit; } $temp_dir = '../tmp/'.$_GET['resumableIdentifier']; $uploader_file = $temp_dir.'/'.$resumableFilename.'.part'.$_GET['resumableChunkNumber']; if (!file_exists($uploader_file)) { header("HTTP/1.0 204 No Content"); exit; } header("HTTP/1.0 200 Ok"); exit; } if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_FILES)) { @set_time_limit(0); $resumableIdentifier = filter_input(INPUT_POST, 'resumableIdentifier', FILTER_SANITIZE_SPECIAL_CHARS); $resumableChunkNumber = filter_input(INPUT_POST, 'resumableChunkNumber', FILTER_VALIDATE_INT); $resumableTotalSize = filter_input(INPUT_POST, 'resumableTotalSize', FILTER_VALIDATE_INT); $resumableTotalChunks = filter_input(INPUT_POST, 'resumableTotalChunks', FILTER_VALIDATE_INT); $resumableChunkSize = filter_input(INPUT_POST, 'resumableChunkSize', FILTER_VALIDATE_INT); $relative_path = rtrim($_POST['resumableRelativePath'], $_POST['resumableFilename']); $getlocfull .= $relative_path; $logloc .= $relative_path; $resumabledata = $uploader->setupFilename($_POST['resumableFilename']); $resumableFilename = $resumabledata['filename']; $finalFilename = $resumabledata['finalname']; foreach ($_FILES as $file) { // init the destination file (format <filename.ext>.part<#chunk> // the file is stored in a temporary directory $temp_dir = '../tmp/'.$resumableIdentifier; $dest_file = $temp_dir.'/'.$resumableFilename.'.part'.$resumableChunkNumber; // create the temporary directory if (!is_dir($temp_dir)) { mkdir($temp_dir, 0775, true); } // move the temporary file if (!move_uploaded_file($file['tmp_name'], $dest_file)) { Utils::setError( ' <span><i class="bi bi-exclamation-triangle"></i> Error saving chunk ' .$resumableChunkNumber.' for '.$resumableFilename.'</span> ' ); } else { // Check if all the parts present if ($uploader->checkChunks($temp_dir, $resumableTotalSize, $resumableChunkSize, $resumableTotalChunks)) { // Create the final destination file $uploader->createFileFromChunks( $getlocfull, $temp_dir, $resumableFilename, $resumableTotalSize, $resumableTotalChunks, $logloc, $finalFilename, $relative_path ); } exit; } } } exit; } $message = '<span><i class="bi bi-exclamation-triangle"></i> '.$setUp->getLangString('upload_not_allowed').'</span> '; Utils::setError($message);