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