typemill/system/Models/ProcessFile.php
2020-04-05 19:13:10 +02:00

165 lines
No EOL
3.8 KiB
PHP

<?php
namespace Typemill\Models;
use Slim\Http\UploadedFile;
use Typemill\Models\Helpers;
use \URLify;
class ProcessFile extends ProcessAssets
{
/**
* Moves the uploaded file to the upload directory. Only used for settings / NON VUE.JS uploads
*
* @param string $directory directory to which the file is moved
* @param UploadedFile $uploadedFile file uploaded file to move
* @return string filename of moved file
*/
public function moveUploadedFile(UploadedFile $uploadedFile, $overwrite = false, $name = false)
{
$this->setFileName($uploadedFile->getClientFilename(), 'file');
if($name)
{
$this->setFileName($name . '.' . $this->extension, 'file', $overwrite);
}
$uploadedFile->moveTo($this->fileFolder . $this->getFullName());
return $this->getFullName();
}
public function storeFile($file, $name)
{
$this->setFileName($name, 'file');
$this->clearTempFolder();
$file = $this->decodeFile($file);
$path = $this->tmpFolder . $this->getFullName();
if(file_put_contents($path, $file))
{
$size = filesize($path);
$size = $this->formatSizeUnits($size);
$title = str_replace('-', ' ', $this->filename);
$title = $title . ' (' . strtoupper($this->extension) . ', ' . $size .')';
return ['title' => $title, 'name' => $this->filename, 'extension' => $this->extension, 'size' => $size, 'url' => 'media/files/' . $this->getFullName()];
}
return false;
}
public function publishFile()
{
$files = scandir($this->tmpFolder);
$success = true;
foreach($files as $file)
{
if (!in_array($file, array(".","..")))
{
$success = rename($this->tmpFolder . $file, $this->fileFolder . $file);
}
}
return $success;
}
public function decodeFile(string $file)
{
$fileParts = explode(";base64,", $file);
$fileType = explode("/", $fileParts[0]);
$fileData = base64_decode($fileParts[1]);
if ($fileData !== false)
{
return array("file" => $fileData, "type" => $fileType[1]);
}
return false;
}
public function deleteFile($name)
{
# validate name
$name = basename($name);
if(file_exists($this->fileFolder . $name) && unlink($this->fileFolder . $name))
{
return true;
}
return false;
}
public function deleteFileWithName($name)
{
# e.g. delete $name = 'logo';
$name = basename($name);
if($name != '' && !in_array($name, array(".","..")))
{
foreach(glob($this->fileFolder . $name . '.*') as $file)
{
unlink($file);
}
}
}
/*
* scans content of a folder (without recursion)
* vars: folder path as string
* returns: one-dimensional array with names of folders and files
*/
public function scanFilesFlat()
{
$files = scandir($this->fileFolder);
$filelist = array();
foreach ($files as $key => $name)
{
if (!in_array($name, array(".","..")) && file_exists($this->fileFolder . $name))
{
$filelist[] = [
'name' => $name,
'timestamp' => filemtime($this->fileFolder . $name),
'info' => pathinfo($this->fileFolder . $name),
'url' => 'media/files/' . $name,
];
}
}
$filelist = Helpers::array_sort($filelist, 'timestamp', SORT_DESC);
return $filelist;
}
public function getFileDetails($name, $structure)
{
$name = basename($name);
if (!in_array($name, array(".","..")) && file_exists($this->fileFolder . $name))
{
$filedetails = [
'name' => $name,
'timestamp' => filemtime($this->fileFolder . $name),
'bytes' => filesize($this->fileFolder . $name),
'info' => pathinfo($this->fileFolder . $name),
'url' => 'media/files/' . $name,
'pages' => $this->findPagesWithUrl($structure, $name, $result = [])
];
return $filedetails;
}
return false;
}
}