<?php
namespace AppBundle\Service;
use AppBundle\Entity;
use AppBundle\Repository\FileRepository;
use Doctrine\DBAL\Connection;
use Symfony\Component\HttpFoundation\
File\
File as HttpFoundationFile
;
class FileUploader
{
/**
* @var FileNameGenerator
*/
private $fileNameGenerator;
/**
* @var Connection
*/
private $connection;
/**
* @var FileRepository
*/
private $fileRepository;
/**
* @var string
*/
private $uploadDirectory;
/**
* @param string $uploadDirectory
* @param FileNameGenerator $fileNameGenerator
* @param FileRepository $fileRepository
* @param Connection $connection
*/
public function __construct(
$uploadDirectory,
FileNameGenerator $fileNameGenerator,
FileRepository $fileRepository,
Connection $connection
) {
$this->uploadDirectory = $uploadDirectory;
$this->fileNameGenerator = $fileNameGenerator;
$this->connection = $connection;
$this->fileRepository = $fileRepository;
}
/**
* @param HttpFoundationFile $httpFoundationFile
* @param string $clientOriginalName
* @return Entity\File
*/
public function upload(HttpFoundationFile $httpFoundationFile, $clientOriginalName)
{
$saveAs = $this->fileNameGenerator->generatePath($httpFoundationFile);
$file = Entity\
File::create($httpFoundationFile, $clientOriginalName, $saveAs);
$saveFileInTransaction = function () use ($httpFoundationFile, $file, $saveAs) {
$httpFoundationFile->move($this->uploadDirectory, $saveAs);
$this->fileRepository->add($file);
};
$this->connection->transactional($saveFileInTransaction);
return $file;
}
}
PD9waHAKCm5hbWVzcGFjZSBBcHBCdW5kbGVcU2VydmljZTsKCnVzZSBBcHBCdW5kbGVcRW50aXR5Owp1c2UgQXBwQnVuZGxlXFJlcG9zaXRvcnlcRmlsZVJlcG9zaXRvcnk7CnVzZSBEb2N0cmluZVxEQkFMXENvbm5lY3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxIdHRwRm91bmRhdGlvblxGaWxlXEZpbGUgYXMgSHR0cEZvdW5kYXRpb25GaWxlOwoKY2xhc3MgRmlsZVVwbG9hZGVyCnsKICAgIC8qKgogICAgICogQHZhciBGaWxlTmFtZUdlbmVyYXRvcgogICAgICovCiAgICBwcml2YXRlICRmaWxlTmFtZUdlbmVyYXRvcjsKCiAgICAvKioKICAgICAqIEB2YXIgQ29ubmVjdGlvbgogICAgICovCiAgICBwcml2YXRlICRjb25uZWN0aW9uOwoKICAgIC8qKgogICAgICogQHZhciBGaWxlUmVwb3NpdG9yeQogICAgICovCiAgICBwcml2YXRlICRmaWxlUmVwb3NpdG9yeTsKCiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgJHVwbG9hZERpcmVjdG9yeTsKCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJHVwbG9hZERpcmVjdG9yeQogICAgICogQHBhcmFtIEZpbGVOYW1lR2VuZXJhdG9yICRmaWxlTmFtZUdlbmVyYXRvcgogICAgICogQHBhcmFtIEZpbGVSZXBvc2l0b3J5ICRmaWxlUmVwb3NpdG9yeQogICAgICogQHBhcmFtIENvbm5lY3Rpb24gJGNvbm5lY3Rpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAogICAgICAgICR1cGxvYWREaXJlY3RvcnksCiAgICAgICAgRmlsZU5hbWVHZW5lcmF0b3IgJGZpbGVOYW1lR2VuZXJhdG9yLAogICAgICAgIEZpbGVSZXBvc2l0b3J5ICRmaWxlUmVwb3NpdG9yeSwKICAgICAgICBDb25uZWN0aW9uICRjb25uZWN0aW9uCiAgICApIHsKICAgICAgICAkdGhpcy0+dXBsb2FkRGlyZWN0b3J5ID0gJHVwbG9hZERpcmVjdG9yeTsKICAgICAgICAkdGhpcy0+ZmlsZU5hbWVHZW5lcmF0b3IgPSAkZmlsZU5hbWVHZW5lcmF0b3I7CiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSAkY29ubmVjdGlvbjsKICAgICAgICAkdGhpcy0+ZmlsZVJlcG9zaXRvcnkgPSAkZmlsZVJlcG9zaXRvcnk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gSHR0cEZvdW5kYXRpb25GaWxlICRodHRwRm91bmRhdGlvbkZpbGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNsaWVudE9yaWdpbmFsTmFtZQogICAgICogQHJldHVybiBFbnRpdHlcRmlsZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdXBsb2FkKEh0dHBGb3VuZGF0aW9uRmlsZSAkaHR0cEZvdW5kYXRpb25GaWxlLCAkY2xpZW50T3JpZ2luYWxOYW1lKQogICAgewogICAgICAgICRzYXZlQXMgPSAkdGhpcy0+ZmlsZU5hbWVHZW5lcmF0b3ItPmdlbmVyYXRlUGF0aCgkaHR0cEZvdW5kYXRpb25GaWxlKTsKICAgICAgICAkZmlsZSA9IEVudGl0eVxGaWxlOjpjcmVhdGUoJGh0dHBGb3VuZGF0aW9uRmlsZSwgJGNsaWVudE9yaWdpbmFsTmFtZSwgJHNhdmVBcyk7CgogICAgICAgICRzYXZlRmlsZUluVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB1c2UgKCRodHRwRm91bmRhdGlvbkZpbGUsICRmaWxlLCAkc2F2ZUFzKSB7CiAgICAgICAgICAgICRodHRwRm91bmRhdGlvbkZpbGUtPm1vdmUoJHRoaXMtPnVwbG9hZERpcmVjdG9yeSwgJHNhdmVBcyk7CiAgICAgICAgICAgICR0aGlzLT5maWxlUmVwb3NpdG9yeS0+YWRkKCRmaWxlKTsKICAgICAgICB9OwoKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+dHJhbnNhY3Rpb25hbCgkc2F2ZUZpbGVJblRyYW5zYWN0aW9uKTsKCiAgICAgICAgcmV0dXJuICRmaWxlOwogICAgfQp9