WIP: Implement uploads

This commit is contained in:
Björn Fromme
2023-09-18 17:56:33 +02:00
parent ce97017ac4
commit d6687c3ca4
51 changed files with 1123 additions and 168 deletions
+134
View File
@@ -0,0 +1,134 @@
<?php
namespace App\Service\Upload;
use App\Entity\Upload;
use App\Model\UploadDto;
use App\Model\UploadSessionDto;
use Oneup\UploaderBundle\Uploader\Orphanage\OrphanageManager;
use Symfony\Component\Filesystem\Exception\IOException;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\RequestStack;
class UploadHandler
{
public const SESSION_KEY = 'myep_upload_session';
public function __construct(
private readonly RequestStack $requestStack,
private readonly OrphanageManager $orphanageManager,
private readonly string $projectDir
) {
}
public function getUploadSession(): UploadSessionDto
{
$session = $this->requestStack->getSession();
if ($session->has(self::SESSION_KEY) && null !== $session->get(self::SESSION_KEY)) {
/** @var UploadSessionDto $uploadSession */
$uploadSession = $session->get(self::SESSION_KEY);
} else {
$uploadSession = new UploadSessionDto();
$session->set(self::SESSION_KEY, $uploadSession);
}
return $uploadSession;
}
public function destroyUploadSession(): void
{
$this->requestStack->getSession()->remove(self::SESSION_KEY);
}
public function flushUploadSession(UploadSessionDto $uploadSession): void
{
$uploadSession->flushUploads();
$session = $this->requestStack->getSession();
$session->set(self::SESSION_KEY, $uploadSession);
}
public function addUploadToSession(UploadDto $upload): UploadSessionDto
{
$uploadSession = $this->getUploadSession();
$uploadSession->addUpload($upload);
$session = $this->requestStack->getSession();
$session->set(self::SESSION_KEY, $uploadSession);
return $uploadSession;
}
public function removeUploadFromSession(string $filename): UploadSessionDto
{
$uploadSession = $this->getUploadSession();
$uploadSession->removeUpload($filename);
$session = $this->requestStack->getSession();
$session->set(self::SESSION_KEY, $uploadSession);
return $uploadSession;
}
public function moveUploadSessionFilesFromOrphanage(string $uploader, UploadSessionDto $uploadSession): void
{
$uploadSessionFilenames = $this->getUploadSessionFilenames($uploadSession, true);
$this->moveUploads($uploader, $uploadSessionFilenames);
}
public function moveUploads(string $uploader, array $filenames = []): array
{
$manager = $this->orphanageManager->get($uploader);
if (0 === count($filenames)) {
return $manager->uploadFiles();
}
$files = $manager->getFiles();
$files->files()->name($filenames);
return $manager->uploadFiles(iterator_to_array($files));
}
public function removeUploadedFile(Upload $upload): void
{
$filepath = $this->getUploadFilepath($upload);
$filesystem = new Filesystem();
try {
$filesystem->remove($filepath);
} catch (IOException $e) {
}
}
public function getUploadSessionFilenames(UploadSessionDto $uploadSession, bool $basename = false): array
{
$uploadSessionId = $uploadSession->getUid();
return $uploadSession
->getUploads()
->map(function (UploadDto $uploadDto) use ($basename, $uploadSessionId) {
return true === $basename ? $uploadDto->getFilename() : $this->getTempUploadFilepath($uploadDto, $uploadSessionId);
})
->toArray()
;
}
public function getUploadFilepath(Upload $upload): string
{
return sprintf('%s/uploads/%s/%s', $this->projectDir, $upload->getType(), $upload->getFilename());
}
public function getTempUploadFilepath(UploadDto $uploadDto, string $uploadSessionId): string
{
$tempUploadDir = $this->getTempUploadDir($uploadSessionId);
return sprintf('%s/%s', $tempUploadDir, $uploadDto->getFilename());
}
public function getTempUploadDir(string $uploadSessionId): string
{
return sprintf('%s/uploads/temp/%s', $this->projectDir, $uploadSessionId);
}
}
+15
View File
@@ -0,0 +1,15 @@
<?php
namespace App\Service\Upload;
use Oneup\UploaderBundle\Uploader\File\FileInterface;
use Oneup\UploaderBundle\Uploader\Naming\NamerInterface;
use Symfony\Component\Uid\Uuid;
class UploadNamer implements NamerInterface
{
public function name(FileInterface $file): string
{
return sprintf('%s.%s', Uuid::v4(), strtolower($file->getExtension()));
}
}