ответ

1

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

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

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

+0

Если делать это, я хотел бы предложить добавить метку времени или, по крайней мере рандов (11111, 99999) на имя файла, потому что файл может быть перезаписан, если загружен другой файл с тем же именем. – kunicmarko20

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^