5

Я пытаюсь использовать OneupUploaderBundle для загрузки файлов. Я много раз читал документацию этого пакета, но мне не удалось найти простой пример объекта для загрузки файла. Мои ожидания является определение класса похоже на VichUploaderBundle:Простой пример файла сущности, который будет загружен с помощью OneupUploaderBundle

<?php 

namespace Minn\AdsBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\HttpFoundation\File\File; 
use Symfony\Component\Validator\Constraints as Assert; 
use Vich\UploaderBundle\Mapping\Annotation as Vich; 

/** 
* @ORM\Entity 
* @Vich\Uploadable 
*/ 
class MotorsAdsFile { 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 

    /** 
    * @Assert\File(
    *  maxSize="5M", 
    *  mimeTypes={"image/png", "image/jpeg"} 
    *) 
    * @Vich\UploadableField(mapping="motors_files", fileNameProperty="filename") 
    * note: This is not a mapped field of entity metadata, just a simple property. 
    * @var File $file 
    */ 
    protected $file; 

    /** 
    * @ORM\Column(type="string", length=255, name="filename") 
    * @var string $filename 
    */ 
    protected $filename; 

    /** 
    * @ORM\Column(type="string", length=255, name="name") 
    * @var string $name 
    */ 
    protected $name; 

    // ... 
} 

Надежда мой вопрос ясно ...

Я действительно заинтересован этим расслоением, так как он поддерживает JQuery.

Спасибо,

+0

Я думаю, вы говорите о [OneupUploaderBundle] (https://github.com/1up-lab/OneupUploaderBundle/issues/136)? – devsheeep

+0

Да ... Я отредактирую свой вопрос сейчас! –

ответ

16

Там нет такого понятия, как предопределенный объект или ОРМ-обработка. Это имеет несколько причин. Этот пакет не может предвидеть потребности в проектах с точки зрения логики загрузки. Если кто-то хочет хранить файлы в базе данных или нет, это полностью их собственный выбор и не должен быть принужден сторонним пакетом. То, что обеспечивает OneupUploaderBundle, является бэкэнд для наиболее распространенных сторонних пользователей.


Отказ от ответственности: Я коротышка скопирована и продлил an answer, которая уже присутствует в системе отслеживания проблем GitHub этого расслоения. Там вы найдете довольно много информации о том, как и почему этот пакет является тем, чем он является сейчас.


Учитывая, что вы уже установили рабочий проект Symfony2, следовать installation instructions из этого пучка. Я думаю, что шаги 1 и 2 не должны быть проблемой, поэтому переходим непосредственно к шагу 3, конфигурации.

Вы сказали, что пытались интегрировать jQuery File Uploader, поэтому давайте создадим для него сопоставление. Откройте файл app/config/config.yml и добавьте следующие строки в конец.

oneup_uploader: 
    mappings: 
     gallery: 
      frontend: blueimp 

И, конечно же, не забудьте добавить следующие строки в app/config/routing.yml.

oneup_uploader: 
    resource: . 
    type: uploader 

Так много для конфигурации. Для простоты мы изменим AcmeDemoBundle.

Открыть файл src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig и удалить все от {% block content %} и {% endblock %}. Нам это больше не нужно.

Теперь вставьте следующее:

<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script> 
<script type="text/javascript" src="https://rawgithub.com/blueimp/jQuery-File-Upload/master/js/vendor/jquery.ui.widget.js"></script> 
<script type="text/javascript" src="https://rawgithub.com/blueimp/jQuery-File-Upload/master/js/jquery.iframe-transport.js"></script> 
<script type="text/javascript" src="https://rawgithub.com/blueimp/jQuery-File-Upload/master/js/jquery.fileupload.js"></script> 

<script type="text/javascript"> 
$(document).ready(function() { 
    $('#fileupload').fileupload({}); 
}); 
</script> 

<input id="fileupload" type="file" name="files[]" data-url="{{ oneup_uploader_endpoint('gallery') }}" multiple /> 

Укажите ваш браузер корневой директории этого приложения (app_dev.php). Вы увидите поле ввода, как и ожидалось, и теперь вы можете загружать некоторые изображения (например). Файлы будут храниться в web/uploads/gallery каждый с уникальным именем файла. Обратите внимание, что мы использовали некоторые CDN для обслуживания файлов JavaScript, необходимых для этого.

На данный момент у вас уже есть рабочая форма загрузки. Но, помимо загрузки файлов в каталог uploads, он ничего не делает. Здесь Next step section в документации пригодится.

Как я понимаю ваш вопрос, вы хотите создать объект, который хранит в нем путь к файлу связанного с ним файла. Для этого создайте свой класс Entity, включая все обязательные поля.

<?php 

namespace Minn\AdsBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
*/ 
class MotorsAdsFile { 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 
    /** 
    * @ORM\Column(type="string", length=255, name="filename") 
    * @var string $filename 
    */ 
    protected $filename; 

    // ... 
} 

Затем создайте EventListener, как описано в the documentation этого расслоения.

<?php 

namespace Acme\HelloBundle\EventListener; 

use Oneup\UploaderBundle\Event\PostPersistEvent; 
use Minn\AdsBundle\Entity\MotorsAdsFile; 

class UploadListener 
{ 
    protected $manager; 

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

    public function onUpload(PostPersistEvent $event) 
    { 
     $file = $event->getFile(); 

     $object = new MotorsAdsFile(); 
     $object->setFilename($file->getPathName()); 

     $this->manager->persist($object); 
     $this->manager->flush(); 
    } 
} 

И, конечно, зарегистрируйте слушателя событий.

<services> 
    <service id="acme_hello.upload_listener" class="Acme\HelloBundle\EventListener\UploadListener"> 
     <argument type="service" id="doctrine.orm.entity_manager" /> 
     <tag name="kernel.event_listener" event="oneup_uploader.post_persist" method="onUpload" /> 
    </service> 
</services> 

На данный момент EventListener будет называться как только новый файл был загружен с помощью настроенного отображения. Он берет этот файл, создает новый объект MotorsAdsFile и сохраняет путь к файлу filename, сохраняется и сбрасывает его в базовую базу данных.

Поскольку я не могу предсказать вашу фактическую логику, это самый простой пример, о котором я могу думать. Вы, конечно, можете делать все, что необходимо в прослушивателе событий. (Если вам нужно сохранить этот объект в другом объекте или тому подобное.)

В документации Next steps section вы найдете кучу других тем. Например, как вы загрузили change the naming strategy или как enable chunked uploads, если вам нужно загрузить большие файлы.

+1

Спасибо за замечательный ответ @devsheeep! :) –