WIP: Implement uploads
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user