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

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

<?php

namespace MinnAdsBundleEntity;

use DoctrineORMMapping as ORM;
use SymfonyComponentHttpFoundationFileFile;
use SymfonyComponentValidatorConstraints as Assert;
use VichUploaderBundleMappingAnnotation as Vich;

/**
 * @ORMEntity
 * @VichUploadable
 */
class MotorsAdsFile {

    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     */
    public $id;

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

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

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

    // ... 
}

Надеюсь, мой вопрос понятен...

меня действительно интересует этот пакет, так как он поддерживает jQuery.

спасибо,

1 ответов


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


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


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

Вы сказали, Вы пытался интегрировать загрузчик файлов jQuery, поэтому давайте создадим для него отображение. Откройте файл 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.РНР.) Вы увидите поле ввода, как и ожидалось, и теперь вы можете загружать изображения (к примеру). Файлы будут храниться в web/uploads/gallery каждый с уникальным именем. Обратите внимание, что мы использовали некоторые CDNs для обслуживания файлов JavaScript, необходимых для этого.

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

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

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

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

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