Symfony 3.1 и OneUpUploaderBundle + Plupload = UploadListener не вызывается
ПОЯСНЕНИЯ
Этот вопрос отличается от аналогичного вопроса тем, что я использую другую библиотеку загрузки (Plupload
в этом вопросе по сравнению с FineUploader
в аналогичном вопросе).
На момент написания этого вопроса я не знал, в чем проблема - поэтому я ожидал, что использование другой библиотеки может показать путь к решению проблемы.
ВСТУПЛЕНИЕ
Три недели назад я создал похожий вопрос о загрузке с помощью OneupUploaderBundle
, но с библиотекой FineUploader. К сожалению, пока нет ответов. В то же время я попытался настроить другую библиотеку загрузки (Blueimp).
Неделю назад я создал похожий вопрос о загрузке с помощью OneupUploaderBundle
, но с библиотекой BlueQ jQuery uplaod. К сожалению, пока нет ответов. Тем временем я попытался настроить другую библиотеку загрузки (Plupload).
Я развиваюсь на Windows 10 Pro
с XAMPP
[1] который включает PHP v7.0.8
,
Я использую Symfony v3.1.2, OneupUploaderBundle и библиотеку Plupload для загрузки файлов на сервер.
При настройке я следовал документации OneUpUploaderBundle
[2] и Plupload
загрузить библиотеку [3], [4].
- [2] Документация OneupUploaderBundle
- [3] Пример OneupUploaderBundle Plupload
- [4] Plupload загружать документацию
ПРОБЛЕМА
Я хочу загрузить файлы в какой-либо каталог, а затем проверить их тип MIME и проверить, разрешен ли тип файла MIME для загрузки, а после этого - переместить их в пользовательский каталог (который может меняться от файла к файлу), наконец, я хочу сохранить путь к файлу и имя файла для базы данных.
Загрузка файлов работает нормально, и файлы загружаются в oneup_uploader_endpoint('gallery')
, Даже пользовательский файл Namer
работает и позволяет загружать в пользовательский каталог.
Однако слушатели не вызываются и отображаются в разделе "События Symfony Profiler". Not Called Listeners
!
К сожалению, я хочу переместить файлы в пользовательский каталог и сохранить информацию о файле в базу данных без Post_Persist
событие Кроме того, проверка не называется эфиром.
КОД
мой services.yml
services:
app.upload_listener:
class: AppBundle\EventListener\UploadListener
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: kernel.event_listener, event: oneup_uploader.post_persist.default_uploader, method: onPostUpload }
- { name: kernel.event_listener, event: oneup_uploader.post_persist.default_uploader, method: onUpload }
app.upload_unique_namer:
class: AppBundle\Uploader\Naming\UploadUniqueNamer
arguments: ["@session"]
мой пользовательский Namer
<?php
namespace AppBundle\Uploader\Naming;
use Oneup\UploaderBundle\Uploader\File\FileInterface;
use Oneup\UploaderBundle\Uploader\Naming\NamerInterface;
use Symfony\Component\HttpFoundation\Session\Session;
class UploadUniqueNamer implements NamerInterface
{
private $session;
public function __construct(Session $session)
{
$this->session = $session;
}
/**
* Creates a user directory name for the file being uploaded.
*
* @param FileInterface $file
* @return string The directory name.
*/
public function name(FileInterface $file)
{
$upload_files_path = $this->session->get('upload_files_path');
$unique_name = uniqid();
return sprintf('%s/%s_%s',
$upload_files_path,
$unique_name,
$file->getClientOriginalName()
);
}
}
мой config.yml
oneup_uploader:
mappings:
gallery:
frontend: plupload
enable_progress: true
namer: app.upload_unique_namer
use_orphanage: false
allowed_mimetypes: [image/png, image/jpg, image/jpeg, image/gif]
max_size: 200M
мой слушатель загрузки:
<?php
namespace AppBundle\EventListener;
use Oneup\UploaderBundle\Event\PreUploadEvent;
use Oneup\UploaderBundle\Event\PostUploadEvent;
use Oneup\UploaderBundle\Event\PostPersistEvent;
use Doctrine\ORM\EntityManager;
use AppBundle\Entity\Product;
class UploadListener
{
/**
* @var EntityManager
*/
private $entityManager;
//protected $originalName;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function onUpload(PostPersistEvent $event)
{
$file = $event->getFile();
$this->originalName = $file->getClientOriginalName();
var_dump('In -- OnUpload');
die();
}
public function onPostUpload(PostPersistEvent $event)
{
$file = $event->getFile();
$object = new Product();
$object->setName($file->getClientOriginalName());
//$object->setName($file->getPathName());
$this->entityManager->persist($object);
$this->entityManager->flush();
var_dump('In -- OnPostUpload');
die();
}
}
upload.html.twig
{% extends 'base.html.twig' %}
{% block stylesheets %}
{{ parent() }}
<link type="text/css" rel="stylesheet" href="{{ asset('js/jquery-ui-1.12.0/jquery-ui.css') }}" />
<link type="text/css" rel="stylesheet" href="{{ asset('js/plupload/jquery.ui.plupload/css/jquery.ui.plupload.css') }}" media="screen" />
{% endblock %}
{% block content %}
<div id="box-upload">
<div id="uploader">
<p>Your browser doesn't have HTML5 support.</p>
</div>
</div>
{% endblock %}
{% block javascripts %}
<script type="text/javascript" src="{{ asset('js/jquery-2.2.4.js') }}"></script>
<script type="text/javascript" src="http://bp.yahooapis.com/2.4.21/browserplus-min.js"></script>
<script type="text/javascript" src="{{ asset('js/jquery-ui-1.12.0/jquery-ui.js') }}"></script>
<script type="text/javascript" src="{{ asset('js/plupload/plupload.full.min.js') }}"></script>
<script type="text/javascript" src="{{ asset('js/plupload/jquery.ui.plupload/jquery.ui.plupload.js') }}"></script>
<script type="text/javascript">
$(function()
{
$("#uploader").plupload(
{
// General settings
runtimes : 'html5',
url: "{{ oneup_uploader_endpoint('gallery') }}",
multi_selection: false,
// Maximum file size
max_file_size: '10mb',
chunk_size: '1mb',
// Resize images on clientside if we can
resize: {
width: 200,
height: 200,
quality: 90,
crop: true // crop to exact dimensions
},
// Specify what files to browse for
filters: [
{title: "Image files", extensions : "jpg,jpeg,png,gif"},
{title: "Zip files", extensions : "zip,avi"}
],
// Rename files by clicking on their titles
rename: true,
// Sort files
sortable: true,
// Enable ability to drag'n'drop files onto the widget (currently only HTML5 supports that)
dragdrop: true,
// Views to activate
views: {
list: true,
thumbs: false, // Show thumbs
active: 'list'
},
// Flash settings
flash_swf_url: '/plupload/js/Moxie.swf',
// Silverlight settings
silverlight_xap_url: '/plupload/js/Moxie.xap'
});
});
</script>
{% endblock %}
ОБНОВЛЕНИЕ
- пока нет
ЗАКЛЮЧЕНИЕ
Пожалуйста, порекомендуйте.
Спасибо за ваше время и знания.
1 ответ
Данная проблема была вызвана неверной конфигурацией event listeners
в services.yml
, Вот рабочая конфигурация.
мой services.yml
services:
app.upload_listener:
class: AppBundle\EventListener\UploadListener
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: kernel.event_listener, event: oneup_uploader.post_persist.gallery, method: onPostUpload }
- { name: kernel.event_listener, event: oneup_uploader.post_persist.gallery, method: onUpload }
app.upload_unique_namer:
class: AppBundle\Uploader\Naming\UploadUniqueNamer
arguments: ["@session"]