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