Простой пример файла сущности для загрузки с 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
свойство, сохраняется и сбрасывает его в базовую базу данных.
Поскольку я не могу предсказать вашу реальную логику, это самый простой пример, который я могу придумать. Вы, конечно, можете делать все, что нужно в прослушивателе событий. (Если вам нужно сохранить этот объект в другом объекте или тому подобное.)
Вы найдете множество других тем в разделе " Следующие шаги" документации. Например, как вы измените стратегию именования загруженных файлов или как включить частичную загрузку в случае, если вам нужно загружать большие файлы.