113 lines
3.9 KiB
PHP
113 lines
3.9 KiB
PHP
<?php
|
|
namespace Contabilidad\Common\Service;
|
|
|
|
use Psr\Http\Message\UploadedFileInterface;
|
|
use Psr\Http\Message\StreamInterface;
|
|
use Nyholm\Psr7\Stream;
|
|
|
|
class FileHandler {
|
|
protected $base_folder;
|
|
protected $valid_types;
|
|
protected $folders;
|
|
public function __construct(object $params) {
|
|
$this->base_folder = $params->folder;
|
|
$this->addValidTypes(array_keys($params->types));
|
|
$this->addFolders($params->types);
|
|
}
|
|
public function addFolders(array $folders): FileHandler {
|
|
foreach ($folders as $type => $folder) {
|
|
$this->addFolder($type, $folder);
|
|
}
|
|
return $this;
|
|
}
|
|
public function addFolder(string $type, string $folder): FileHandler {
|
|
$this->folders[$type] = $folder;
|
|
return $this;
|
|
}
|
|
public function addValidTypes(array $valid_types): FileHandler {
|
|
foreach ($valid_types as $type) {
|
|
$this->addValidType($type);
|
|
}
|
|
return $this;
|
|
}
|
|
public function addValidType(string $type): FileHandler {
|
|
$this->valid_types []= $type;
|
|
return $this;
|
|
}
|
|
public function getType(string $folder): string {
|
|
return array_search($folder, $this->folders);
|
|
}
|
|
|
|
public function uploadFile(UploadedFileInterface $file, string $new_name = null): bool {
|
|
if ($file->getError() !== UPLOAD_ERR_OK) {
|
|
return false;
|
|
}
|
|
if (!in_array($file->getClientMediaType(), $this->valid_types)) {
|
|
return false;
|
|
}
|
|
if ($new_name === null) {
|
|
$new_name = $file->getClientFilename();
|
|
}
|
|
$filenfo = new \SplFileInfo($file->getClientFilename());
|
|
if (!str_contains($new_name, $filenfo->getExtension())) {
|
|
$new_name .= '.' . $filenfo->getExtension();
|
|
}
|
|
$to = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $this->folders[$file->getClientMediaType()], $new_name]);
|
|
$file->moveTo($to);
|
|
return file_exists($to);
|
|
}
|
|
public function listFiles(): array {
|
|
$output = [];
|
|
foreach ($this->folders as $f) {
|
|
$folder = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $f]);
|
|
if (!file_exists($folder)) {
|
|
continue;
|
|
}
|
|
$files = new \DirectoryIterator($folder);
|
|
foreach ($files as $file) {
|
|
if ($file->isDir()) {
|
|
continue;
|
|
}
|
|
$output []= (object) ['folder' => $f, 'filename' => $file->getBasename()];
|
|
}
|
|
}
|
|
return $output;
|
|
}
|
|
protected function validateFilename(string $folder, string $filename): bool|string {
|
|
if (!in_array($folder, $this->folders)) {
|
|
return false;
|
|
}
|
|
$f = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $folder, $filename]);
|
|
if (!file_exists($f)) {
|
|
return false;
|
|
}
|
|
return $f;
|
|
}
|
|
public function getInfo(string $folder, string $filename): \SplFileInfo|bool {
|
|
if (!$f = $this->validateFilename($folder, $filename)) {
|
|
return false;
|
|
}
|
|
return new \SplFileInfo($f);
|
|
}
|
|
public function getFile(string $folder, string $filename): StreamInterface|bool {
|
|
if (!$f = $this->validateFilename($folder, $filename)) {
|
|
return false;
|
|
}
|
|
return Stream::create(file_get_contents($f));
|
|
}
|
|
public function editFilename(string $folder, string $filename, string $new_name): bool {
|
|
if (!$f = $this->validateFilename($folder, $filename)) {
|
|
return false;
|
|
}
|
|
$info = new \SplFileInfo($f);
|
|
$new = implode(DIRECTORY_SEPARATOR, [$this->base_folder, $folder, $new_name . '.' . $info->getExtension()]);
|
|
return rename($f, $new);
|
|
}
|
|
public function deleteFile(string $folder, string $filename): bool {
|
|
if (!$f = $this->validateFilename($folder, $filename)) {
|
|
return false;
|
|
}
|
|
return unlink($f);
|
|
}
|
|
}
|