: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
$this->uploadDebug = 'Upload error: unable open tmp file';
if (!is_uploaded_file($tmpname)) {
if (unlink($tmpname) && $tmpfname) unset($GLOBALS['elFinderTempFiles'][$tmpfname]);
if ($thash !== '' && $thash !== $target) {
if ($dir = $volume->dir($thash)) {
if (!isset($addedDirs[$thash])) {
$addedDirs[$thash] = true;
$result['added'][] = $dir;
// to support multi-level directory creation
$_phash = isset($dir['phash']) ? $dir['phash'] : null;
while ($_phash && !isset($addedDirs[$_phash]) && $_phash !== $target) {
if ($_dir = $volume->dir($_phash)) {
$addedDirs[$_phash] = true;
$result['added'][] = $_dir;
$_phash = isset($_dir['phash']) ? $_dir['phash'] : null;
$result['error'] = $this->error(self::ERROR_UPLOAD, self::ERROR_TRGDIR_NOT_FOUND, 'hash@' . $thash);
// file rename for backup
if (isset($renames[$name])) {
$dir = $volume->realpath($_target);
if (isset($hashes[$name])) {
$hash = $volume->getHash($dir, $name);
$rnres = $this->rename(array('target' => $hash, 'name' => $volume->uniqueName($dir, $name, $suffix, true, 0)));
if (!empty($rnres['error'])) {
$result['warning'] = $rnres['error'];
if (!is_array($rnres['error'])) {
$errors = array_push($errors, $rnres['error']);
$errors = array_merge($errors, $rnres['error']);
if (!$_target || ($file = $volume->upload($fp, $_target, $name, $tmpname, ($_target === $target) ? $hashes : array())) === false) {
$errors = array_merge($errors, $this->error(self::ERROR_UPLOAD_FILE, $name, $volume->error()));
if (!is_uploaded_file($tmpname) && unlink($tmpname)) {
unset($GLOBALS['elFinderTempFiles'][$tmpname]);
is_resource($fp) && fclose($fp);
if (!is_uploaded_file($tmpname)) {
if (!is_file($tmpname) || unlink($tmpname)) {
unset($GLOBALS['elFinderTempFiles'][$tmpname]);
$result['added'][] = $file;
$result = array_merge_recursive($result, $rnres);
$result['warning'] = $errors;
if ($GLOBALS['elFinderTempFiles']) {
foreach (array_keys($GLOBALS['elFinderTempFiles']) as $_temp) {
is_file($_temp) && is_writable($_temp) && unlink($_temp);
$result['removed'] = $volume->removed();
if (!empty($args['node'])) {
$result['callback'] = array(
* Copy/move files into new destination
* @param array command arguments
* @throws elFinderAbortException
* @author Dmitry (dio) Levashov
protected function paste($args)
$targets = is_array($args['targets']) ? $args['targets'] : array();
$cut = !empty($args['cut']);
$error = $cut ? self::ERROR_MOVE : self::ERROR_COPY;
$result = array('changed' => array(), 'added' => array(), 'removed' => array(), 'warning' => array());
if (($dstVolume = $this->volume($dst)) == false) {
return array('error' => $this->error($error, '#' . $targets[0], self::ERROR_TRGDIR_NOT_FOUND, '#' . $dst));
$hashes = $renames = array();
if (!empty($args['renames'])) {
$renames = array_flip($args['renames']);
if (is_string($args['suffix']) && !preg_match('/[\/\\?*:|"<>]/', $args['suffix'])) {
$suffix = $args['suffix'];
if (!empty($args['hashes'])) {
$hashes = array_flip($args['hashes']);
foreach ($targets as $target) {
elFinder::checkAborted();
if (($srcVolume = $this->volume($target)) == false) {
$result['warning'] = array_merge($result['warning'], $this->error($error, '#' . $target, self::ERROR_FILE_NOT_FOUND));
$file = $srcVolume->file($target);
if (isset($renames[$file['name']])) {
$dir = $dstVolume->realpath($dst);
$dstName = $file['name'];
if ($srcVolume !== $dstVolume) {
$this->trigger('paste.copyfrom', array(&$dst, &$dstName, '', $this, $dstVolume), $errors);
} catch (elFinderTriggerException $e) {
$result['warning'] = array_merge($result['warning'], $errors);
if (isset($hashes[$file['name']])) {
$hash = $hashes[$file['name']];
$hash = $dstVolume->getHash($dir, $dstName);
$rnres = $this->rename(array('target' => $hash, 'name' => $dstVolume->uniqueName($dir, $dstName, $suffix, true, 0)));
if (!empty($rnres['error'])) {
$result['warning'] = array_merge($result['warning'], $rnres['error']);
if ($cut && $this->itemLocked($target)) {
$rm = $srcVolume->file($target);
$result['warning'] = array_merge($result['warning'], $this->error(self::ERROR_LOCKED, $rm['name']));
if (($file = $dstVolume->paste($srcVolume, $target, $dst, $cut, $hashes)) == false) {
$result['warning'] = array_merge($result['warning'], $this->error($dstVolume->error()));
if ($error = $dstVolume->error()) {
$result['warning'] = array_merge($result['warning'], $this->error($error));
$result = array_merge_recursive($result, $rnres);
if (count($result['warning']) < 1) {
unset($result['warning']);
* @param array $args command arguments
* @author Dmitry (dio) Levashov
protected function get($args)
$target = $args['target'];
$volume = $this->volume($target);
if (!$volume || ($file = $volume->file($target)) == false) {
return array('error' => $this->error(self::ERROR_OPEN, '#' . $target, self::ERROR_FILE_NOT_FOUND));
if ($volume->commandDisabled('get')) {
return array('error' => $this->error(self::ERROR_OPEN, '#' . $target, self::ERROR_ACCESS_DENIED));
if (($content = $volume->getContents($target)) === false) {
return array('error' => $this->error(self::ERROR_OPEN, $volume->path($target), $volume->error()));
$mime = isset($file['mime']) ? $file['mime'] : '';
if ($mime && (strtolower(substr($mime, 0, 4)) === 'text' || in_array(strtolower($mime), self::$textMimes))) {
if (!$args['conv'] || $args['conv'] == '1') {
if (function_exists('mb_detect_encoding')) {
if ($enc = mb_detect_encoding($content, mb_detect_order(), true)) {
$encu = strtoupper($enc);
if ($encu === 'UTF-8' || $encu === 'ASCII') {
} else if (!preg_match('//u', $content)) {
if ($enc === 'unknown') {
$enc = $volume->getOption('encoding');
if (!$enc || strtoupper($enc) === 'UTF-8') {
// call callbacks 'get.detectencoding'
if (!empty($this->listeners['get.detectencoding'])) {
foreach ($this->listeners['get.detectencoding'] as $handler) {
call_user_func_array($handler, array('get', &$enc, array_merge($args, array('content' => $content)), $this, $volume));
if ($enc && $enc !== 'unknown') {
$errlev = error_reporting();
error_reporting($errlev ^ E_NOTICE);
$utf8 = iconv($enc, 'UTF-8', $content);
if ($utf8 === false && function_exists('mb_convert_encoding')) {
error_reporting($errlev ^ E_WARNING);
$utf8 = mb_convert_encoding($content, 'UTF-8', $enc);
if (mb_convert_encoding($utf8, $enc, 'UTF-8') !== $content) {
if ($utf8 === false || iconv('UTF-8', $enc, $utf8) !== $content) {
error_reporting($errlev);
if ($enc !== 'unknown') {
if ($args['conv'] == '1') {
if ($enc === 'unknown') {
} else if ($enc === 'unknown') {
return array('doconv' => $enc);
if ($args['conv'] == '1') {
if (strtoupper($enc) !== 'UTF-8') {
$errlev = error_reporting();
$this->setToastErrorHandler(array(
error_reporting($errlev | E_NOTICE | E_WARNING);
$content = iconv($enc, 'UTF-8//TRANSLIT', $content);
if ($content === false && function_exists('mb_convert_encoding')) {
$content = mb_convert_encoding($_content, 'UTF-8', $enc);
error_reporting($errlev);
$this->setToastErrorHandler(false);
$content = 'data:' . ($mime ? $mime : 'application/octet-stream') . ';base64,' . base64_encode($content);
if ($content !== false) {
$json = json_encode($content);
if ($content === false || $json === false || strlen($json) < strlen($content)) {
return array('doconv' => 'unknown');
'Content-Type: application/json'
// add cache control headers
if ($cacheHeaders = $volume->getOption('cacheHeaders')) {
$res['header'] = array_merge($res['header'], $cacheHeaders);
* Save content into text file
* @author Dmitry (dio) Levashov
protected function put($args)
$target = $args['target'];
$encoding = isset($args['encoding']) ? $args['encoding'] : '';
if (($volume = $this->volume($target)) == false
|| ($file = $volume->file($target)) == false) {
return array('error' => $this->error(self::ERROR_SAVE, '#' . $target, self::ERROR_FILE_NOT_FOUND));
$this->itemLock($target);
if ($encoding === 'scheme') {
if (preg_match('~^https?://~i', $args['content'])) {
$fp = $this->get_remote_contents($args['content'], 30, 5, 'Mozilla/5.0', $volume->tmpfile());
return array('error' => self::ERROR_SAVE, $args['content'], self::ERROR_FILE_NOT_FOUND);
$fmeta = stream_get_meta_data($fp);
$mime = $this->detectMimeType($fmeta['uri']);
if ($mime === 'unknown') {
$mime = 'application/octet-stream';
$mime = $volume->mimeTypeNormalize($mime, $file['name']);
$args['content'] = 'data:' . $mime . ';base64,' . base64_encode(file_get_contents($fmeta['uri']));
$args['content'] = "\0" . $args['content'];
} else if ($encoding === 'hash') {
$_hash = $args['content'];
if ($_src = $this->getVolume($_hash)) {
if ($_file = $_src->file($_hash)) {
if ($_data = $_src->getContents($_hash)) {
$args['content'] = 'data:' . $file['mime'] . ';base64,' . base64_encode($_data);
$args['content'] = "\0" . $args['content'];
$content = iconv('UTF-8', $encoding, $args['content']);
if ($content === false && function_exists('mb_detect_encoding')) {
$content = mb_convert_encoding($args['content'], $encoding, 'UTF-8');
if ($content !== false) {
$args['content'] = $content;
if (($file = $volume->putContents($target, $args['content'])) == false) {
return array('error' => $this->error(self::ERROR_SAVE, $volume->path($target), $volume->error()));
return array('changed' => array($file));
* Extract files from archive
* @param array $args command arguments
* @author Dmitry (dio) Levashov,
* @author Alexey Sukhotin
protected function extract($args)
$target = $args['target'];
$makedir = isset($args['makedir']) ? (bool)$args['makedir'] : null;
if(strpos($target,'..') !== false){
return array('error' => $this->error(self::ERROR_EXTRACT, '#' . $target, self::ERROR_FILE_NOT_FOUND));
if (($volume = $this->volume($target)) == false
|| ($file = $volume->file($target)) == false) {
return array('error' => $this->error(self::ERROR_EXTRACT, '#' . $target, self::ERROR_FILE_NOT_FOUND));
if ($file = $volume->extract($target, $makedir)) {
$res['added'] = isset($file['read']) ? array($file) : $file;
if ($err = $volume->error()) {
$res['error'] = $this->error(self::ERROR_EXTRACT, $volume->path($target), $volume->error());
* @param array $args command arguments
* @author Dmitry (dio) Levashov,
* @author Alexey Sukhotin
protected function archive($args)
$targets = isset($args['targets']) && is_array($args['targets']) ? $args['targets'] : array();
$name = isset($args['name']) ? $args['name'] : '';
if(strpos($name,'..') !== false){
return $this->error('Invalid Request.', self::ERROR_TRGDIR_NOT_FOUND);
$targets = array_filter($targets, array($this, 'volume'));
if (!$targets || ($volume = $this->volume($targets[0])) === false) {
return $this->error(self::ERROR_ARCHIVE, self::ERROR_TRGDIR_NOT_FOUND);
foreach ($targets as $target) {
$explodedStr = explode('l1_', $target);
$targetFolderName = base64_decode($explodedStr[1]);
if(strpos($targetFolderName,'..') !== false){
return $this->error('Invalid Request.', self::ERROR_TRGDIR_NOT_FOUND);
$this->itemLock($target);
return ($file = $volume->archive($targets, $args['type'], $name))
? array('added' => array($file))
: array('error' => $this->error(self::ERROR_ARCHIVE, $volume->error()));
* @param array $args command arguments
* @throws elFinderAbortException
* @author Dmitry Levashov
protected function search($args)
$mimes = !empty($args['mimes']) && is_array($args['mimes']) ? $args['mimes'] : array();
$target = !empty($args['target']) ? $args['target'] : null;
$type = !empty($args['type']) ? $args['type'] : null;
if ($volume = $this->volume($target)) {
$result = $volume->search($q, $mimes, $target, $type);
$errors = array_merge($errors, $volume->error());
foreach ($this->volumes as $volume) {
$result = array_merge($result, $volume->search($q, $mimes, null, $type));
$errors = array_merge($errors, $volume->error());