2016-08-04 12 views
3

В базовом приложении Symfony 3 установлено и настроено VichUploader bundle с сущностью для загрузки файлов.Данные светильники с пакетом VichUploader в Symfony3

Как подключить файл к этому объекту в моих объектах данных ORM?


Существует question for this problem in Symfony 2, и я попробовал этот код. Весы загружаются без ошибок, но «загруженный» файл не копируется в конечный пункт назначения.

Я могу сделать это вручную, моя последняя попытка выглядит следующим образом:

<?php 
// src/AppBundle/DataFixtures/ORM/LoadCourseData.php 

namespace AppBundle\DataFixtures\ORM; 

use Doctrine\Common\DataFixtures\OrderedFixtureInterface; 
use Doctrine\Common\DataFixtures\AbstractFixture; 
use Doctrine\Common\Persistence\ObjectManager; 
use Symfony\Component\HttpFoundation\File\UploadedFile; 
use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser; 
use AppBundle\Entity\Course; 

class LoadCourseData extends AbstractFixture implements OrderedFixtureInterface 
{ 
    public function load(ObjectManager $manager) 
    { 
     $course = new Course(); 
     $course->setName('How to make data fixtures in Symfony lol') 
      ->setAuthor($this->getReference('admin-user')) 
      ->setSummary('You\'ll know when I know!') 
      ->setLicense($this->getReference('cc-by')) 
      ->setDifficulty(1); 

     // Persist to generate slug (to be used for uploads) 
     $manager->persist($course); 

     // Attach file 

     // I copy it to a temporary directory as per the Symfony2 answer 
     copy(__DIR__.'/../Files/kitten.jpg', '/tmp/kitten.jpg'); 

     // These are filled in for completeness 
     $mimetype = MimeTypeGuesser::getInstance()->guess('/tmp/kitten.jpg'); 
     $size  = filesize('/tmp/kitten.jpg'); 

     // Create a new UploadedFile 
     $file = new UploadedFile('/tmp/kitten.jpg', 'kitten.jpg', $mimetype, $size, null, true); 

     // I have to move it manually? 
     // Plus how can I take advantage of the VichUploader namer? 
     $file->move(__DIR__.'/../../../../web/img/upload/course/'); 

     // Apply to entity 
     $course->setImageFile($file); 

     // Persist 
     $manager->persist($course); 
     $manager->flush(); 
    } 

    public function getOrder() 
    { 
     return 4; 
    } 
} 

Мое решение еще требует много работы! Я лаяю неправильное дерево?

  • Пути выгрузки уже определены в config.yml. Я должен получить доступ к их оттуда или преобразовать их в параметры
  • требует много больше проверок ошибок и исключения метания
  • Файл копируются в место назначения, но имя файл является неправильным, так как он не использует сконфигурированный VichUploader неймера
  • Он должен жить где-то еще, возможно, как услуга?

ответ

1

Я нашел документацию VichUploader на GitHub не очень хорошо, поэтому я предлагаю вам использовать документацию Symfony: http://symfony.com/doc/current/controller/upload_file.html

Я создал FileUploader.php под Src/AppBundle как так:

<?php 

// src/AppBundle/FileUploader.php 
namespace AppBundle; 

use Symfony\Component\HttpFoundation\File\UploadedFile; 

class FileUploader 
{ 
    private $targetDir; 

    public function __construct($targetDir) 
    { 
     $this->targetDir = $targetDir; 
    } 

    public function upload(UploadedFile $file, $path, $name) 
    { 
     $fileName = $name.'.'.$file->guessExtension(); 

     $file->move($this->targetDir.$path, $fileName); 

     return $fileName; 
    } 
} 

Это позволяет указать файл, путь и имя.

Затем в файле приложения/Config/service.yml, добавьте эту ссылку на него:

services: 
    app.attachment_uploader: 
     class: AppBundle\FileUploader 
     arguments: ['%document_directory%'] 

Затем вам нужно указать% document_directory% в вашем приложении/Config/parameters.yml файла:

parameters: 
... 
    document_directory: documents 

В моем случае папка «документы» находится в папке с веб-сайтом, поэтому путь «веб-документы». Я хотел хранить все в одном месте.

Затем я использую FileUploader в любом контроллере так:

... 
->add('catalog', FileType::class, array(   // Docs 
     'label' => 'Catalog Course Description ', 
     'required' => false, 
     'attr' => array(
       'accept' => 'image/*,application/pdf,text/plain,application/msword', 
       'onchange' => "checkFileSize('form_catalog')" 
     ), 
)) 
... 

$file = $form->get("catalog")->getData(); 
$fileName = $this->get('app.attachment_uploader')->upload($file, 
     '/'.$pet->getStudent()->getBanId(), 
     $pet->getCourse()->getCorTitle().'_'.'Catalog_Course_Desc' 
... 

$att_cat->setDocument($fileName); 
$em->persist($att_cat); 
$em->flush(); 

Где в приведенном выше коде, я получаю «Каталог» данные кнопки файла, который является файлом. Затем вызовите метод 'upload', определяющий параметры файла и пути и имени файла. Затем позже сохраняйте Entity ($ att_cat).

Вышеприведенный очень прост в использовании.

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

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