как переименовать загружаемый файл с помощью пакета sonata


Как переименовать файл, который я загружаю с помощью sonata-bundle?

Файл в формате PDF и имя в папке базы данных: /upload/media/default/0001/01/0000000013ac6bf9000000017c7d6398.pdf Я хочу, чтобы мой файл выглядел так : /upload/media/0001/01/myfile.pdf

Спасибо!!

Author: Darkness007, 2015-07-31

2 answers

Если вы не хотите, чтобы файл (только тип файла) переименовывался во время загрузки sonata и сохранял свое первоначальное имя, вам необходимо переопределить класс sonata FileProvider при установке Sonata's Media Bundle хорошо иметь дочерний пакет, генерируя его easy extend пакет по умолчанию он генерирует расширенный пакет в src\Application, но вы можете выбрать свое собственное местоположение, как только у вас будет его расширенный пакет, который находится в src\Application\Sonata\MediaBundle, вы можете переопределить параметр класса FileProvider (sonata.media.provider.file.class), определив в своем файл конфигурации (yml, xml и т.д.)

parameters:
    sonata.media.provider.file.class: Application\Sonata\MediaBundle\Provider\FileProvider

А теперь расширьте свой класс FileProvider с помощью класса сонаты FileProvider, чтобы другие функции работали так, как есть

namespace Application\Sonata\MediaBundle\Provider;
//... other uses classes
use Sonata\MediaBundle\Provider\FileProvider as BaseProvider ;
class FileProvider extends BaseProvider
{

    public function __construct($name, Filesystem $filesystem, CDNInterface $cdn, GeneratorInterface $pathGenerator, ThumbnailInterface $thumbnail, array $allowedExtensions = array(), array $allowedMimeTypes = array(), MetadataBuilderInterface $metadata = null)
    {
        parent::__construct($name, $filesystem, $cdn, $pathGenerator, $thumbnail);

        $this->allowedExtensions = $allowedExtensions;
        $this->allowedMimeTypes  = $allowedMimeTypes;
        $this->metadata = $metadata;
    }

    protected function generateReferenceName(MediaInterface $media)
    {
        return $media->getName();
        /** return $this->generateMediaUniqId($media).'.'.$media->getBinaryContent()->guessExtension();*/
    }

}

В приведенном выше классе sonata задает имя файла в providerReference, вызывая generateReferenceName() в этой функции, он генерирует уникальное имя для каждого файла, используя sha1 что-то вроде sha1($media->getName().uniqid().rand(11111, 99999)), поэтому, чтобы иметь оригинальное имя для загруженного файла, просто верните $media->getName() в этой функции, и ваш загруженный файл будет иметь то же имя

 1
Author: M Khalid Junaid, 2015-07-31 15:52:48

Чтобы изменить имя файла (только тип файла) перед загрузкой, вы можете следовать моему предыдущему ответу для переопределения класса FileProvider, а затем в своем классе переопределите функцию поставщика базовых файлов getDownloadResponse() и определите желаемое имя для файла загрузки

public function getDownloadResponse(MediaInterface $media, $format, $mode, array $headers = array())
{

    $guesser = ExtensionGuesser::getInstance();
    $extension = $guesser->guess($media->getContentType());
    // build the default headers
    $headers = array_merge(array(
        'Content-Type'          => $media->getContentType(),
        'Content-Disposition'   => sprintf('attachment; filename="%s"', 'myfile.'.$extension),
    ), $headers);

    if (!in_array($mode, array('http', 'X-Sendfile', 'X-Accel-Redirect'))) {
        throw new \RuntimeException('Invalid mode provided');
    }

    if ($mode == 'http') {
        if ($format == 'reference') {
            $file = $this->getReferenceFile($media);
        } else {
            $file = $this->getFilesystem()->get($this->generatePrivateUrl($media, $format));
        }

        return new StreamedResponse(function() use ($file) {
            echo $file->getContent();
        }, 200, $headers);
    }

    if (!$this->getFilesystem()->getAdapter() instanceof \Sonata\MediaBundle\Filesystem\Local) {
        throw new \RuntimeException('Cannot use X-Sendfile or X-Accel-Redirect with non \Sonata\MediaBundle\Filesystem\Local');
    }

    $filename = sprintf('%s/%s',
        $this->getFilesystem()->getAdapter()->getDirectory(),
        $this->generatePrivateUrl($media, $format)
    );

    return new BinaryFileResponse($filename, 200, $headers);
}
 0
Author: M Khalid Junaid, 2015-07-31 16:24:19