как переименовать загружаемый файл с помощью пакета sonata
Как переименовать файл, который я загружаю с помощью sonata-bundle?
Файл в формате PDF и имя в папке базы данных: /upload/media/default/0001/01/0000000013ac6bf9000000017c7d6398.pdf
Я хочу, чтобы мой файл выглядел так : /upload/media/0001/01/myfile.pdf
Спасибо!!
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()
в этой функции, и ваш загруженный файл будет иметь то же имя
Чтобы изменить имя файла (только тип файла) перед загрузкой, вы можете следовать моему предыдущему ответу для переопределения класса 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);
}