Простой пример файла сущности для загрузки с OneupUploaderBundle

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

<?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.

Спасибо,

1 ответ

Решение

Нет такой вещи как предопределенная сущность или ORM-обработка. Это имеет несколько причин. Этот пакет не может предвидеть потребности проектов с точки зрения логики загрузки. Если кто-то хочет сохранить файлы в базе данных или нет, это полностью их собственный выбор, и его не должен заставлять сторонний пакет. OneupUploaderBundle предоставляет бэкэнд для самых распространенных загрузчиков внешнего интерфейса.


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


Учитывая, что вы уже установили работающий проект Symfony2, следуйте инструкциям по установке этого пакета. Я думаю, что шаги 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, необходимых для этого.

На данный момент у вас уже есть рабочая форма загрузки. Но кроме загрузки файлов в каталог загрузки, он ничего не делает. Именно здесь пригодится раздел " Следующий шаг" в документации.

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

<?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 свойство, сохраняется и сбрасывает его в базовую базу данных.

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

Вы найдете множество других тем в разделе " Следующие шаги" документации. Например, как вы измените стратегию именования загруженных файлов или как включить частичную загрузку в случае, если вам нужно загружать большие файлы.

Другие вопросы по тегам