<?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