Там нет такого понятия, как предопределенный объект или ОРМ-обработка. Это имеет несколько причин. Этот пакет не может предвидеть потребности в проектах с точки зрения логики загрузки. Если кто-то хочет хранить файлы в базе данных или нет, это полностью их собственный выбор и не должен быть принужден сторонним пакетом. То, что обеспечивает 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, если вам нужно загрузить большие файлы.
Я думаю, вы говорите о [OneupUploaderBundle] (https://github.com/1up-lab/OneupUploaderBundle/issues/136)? – devsheeep
Да ... Я отредактирую свой вопрос сейчас! –