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

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

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

благодарю вас !!

3

Решение

Если вы не хотите, чтобы файл (только файл типа) переименовывался при загрузке с помощью 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() в этой функции и ваш загруженный файл будет иметь то же имя

2

Другие решения

Чтобы изменить имя файла (только тип файла) перед загрузкой, вы можете следовать моему предыдущему ответу для переопределения 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

По вопросам рекламы [email protected]