Symfony 3.1 и OneUpUploaderBundle + Blueimp = UploadListener не вызывается

ВСТУПЛЕНИЕ

Почти две недели назад я создал похожий вопрос о загрузке с помощью OneupUploaderBundle, но с FineUploader библиотека. К сожалению, пока нет ответов.
Тем временем я попытался настроить другую библиотеку загрузки.

Я развиваюсь на Windows 10 Pro с XAMPP [1] который включает PHP v7.0.8,

Я использую Symfony v3.1.5, OneupUploaderBundle а также Blueimp JQuery загрузить для того, чтобы загрузить файлы на сервер.

При настройке я следовал документации OneUpUploaderBundle [2] и jQuery file upload [3], [4].

ПРОБЛЕМА

Я хочу загрузить файлы в какой-либо каталог, а затем проверить их тип пантомимы и validate — тип файла MIME, разрешенный для загрузки, и после этого — перемещение их в пользовательский каталог (который может изменяться от файла к файлу), наконец, я хочу сохранить путь к файлу и имя файла в базе данных.

Загрузка файлов работает нормально, и файлы загружаются в oneup_uploader_endpoint('gallery'), Даже пользовательский файл Namer работает и позволяет загружать в пользовательский каталог.

Тем не мение, слушатели не называются (загрузка слушателей и проверка) и отображаются в разделе событий Symfony Profiler Not Called Listeners!

К сожалению, я хочу сохранить информацию о файле в базу данных, используя Post_Persist событие. События OneupUploaderBundle.

КОД

мой 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: onUpload }
- { name: kernel.event_listener, event: oneup_uploader.post_persist.default_uploader, method: onPostUpload }

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: blueimp
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();
}

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();
}
}

upload.html.twig

{% extends 'base.html.twig' %}

{% block stylesheets %}
{{ parent() }}
<link rel="stylesheet" type="text/css" href="{{ asset('css/blueimp/jquery.fileupload.css') }}" />
<link rel="stylesheet" type="text/css" href="{{ asset('css/bootstrap/bootstrap.css') }}" />
<link rel="stylesheet" type="text/css" href="{{ asset('css/bootstrap/bootstrap-theme.css') }}" />
{% endblock %}

{% block content %}
<div id="box-list" class="clearfix">
Go to: <a href="{{ path('product_list') }}">Product list</a>
</div>
<div id="box-upload">
<div id="box-file-upload">
<form method="post" enctype="multipart/form-data">
<span class="btn btn-success fileinput-button">
<i class="glyphicon glyphicon-plus"></i>
<span>&nbsp;Choose files...</span>
<input id="file-upload" type="file" name="files[]" data-url="{{ oneup_uploader_endpoint('gallery') }}" />
</span>
</form>
</div>
<div id="box-progress">
<div id="box-progress-bar" style="width: 0%;"></div>
</div>
<div id="box-info">
<p>Upload status...</p>
</div>
</div>
{% endblock %}

{% block javascripts %}
{{ parent() }}
<script type="text/javascript" src="{{ asset('js/jquery-3.1.0.js') }}"></script>
<script type="text/javascript" src="{{ asset('js/blueimp/jquery.ui.widget.js') }}"></script>
<script type="text/javascript" src="{{ asset('js/blueimp/jquery.iframe-transport.js') }}"></script>
<script type="text/javascript" src="{{ asset('js/blueimp/jquery.fileupload.js') }}"></script>
<script type="text/javascript">
$(function()
{
'use strict';
$('#file-upload').on('click', function ()
{
$('#box-progress-bar').css('width', '1%');
});

$('#file-upload').on("fileuploadprocessfail", function(e, data)
{
var file = data.files[data.index];
alert(file.error);
console.log(file.error);
});

$('#file-upload').fileupload({
dataType: 'json',
add: function (e, data)
{
var fileName = data.files[0].name;
var fileType = data.files[0].name.split('.').pop();
var allowedTypes = 'jpg,JPG,jpeg,JPEG,png,PNG,gif,GIF';
if (allowedTypes.indexOf(fileType) < 0)
{
$('#box-progress-bar').css('width', '0');
$('<p/>').text(fileName).appendTo($('#box-info'));
$('<p class="wrong-file-type"/>').text('Invalid file type').appendTo($('#box-info'));
return false;
}
else
{
$('<p/>').text(fileName).appendTo($('#box-info'));
if ($('.button-upload').length == 0)
{
// disabling file input
$('input#file-upload').attr('disabled', true);

data.context = $('<button class="button-upload btn btn-primary start"/>').text('Upload')
.appendTo($('#box-info'))
.click(function ()
{
data.context = $('<p class="upload-success"/>').text('Uploading...').replaceAll($(this));
($('.button-cancel')).remove();
data.submit();
});
$('<button class="button-cancel btn btn-warning cancel" />').text('Cancel')
.appendTo($('#box-info'))
.click(function ()
{
$('#box-progress-bar').css('width', '0');
//console.log('testing');
var message = 'Upload canceled';
($('.button-upload')).remove();
($('.button-cancel')).remove();
$('<p class="wrong-file-type"/>').text(message).appendTo($('#box-info'));
// enabling file input
$('input#file-upload').attr('disabled', false);
});
}
}
},
progressall: function (e, data)
{
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#box-progress-bar').css('width', progress + '%');
},
done: function (e, data)
{
data.context.text('Upload finished.');
// enabling file input
$('input#file-upload').attr('disabled', false);
}
});
});
</script>
{% endblock %}

ОБНОВЛЕНИЕ

  1. Добавлена ​​заметка о среде разработки.
  2. Пробовал такой же код с Symfony v2.8.8, к сожалению UploadListener не вызывается.
  3. отредактированный services.yml, удалил (я думаю) теперь ненужную (дублированную — предоставленную в OneupUploaderBundle) проверку, которую я добавил при попытке заставить ее работать …

ЗАКЛЮЧЕНИЕ

Пожалуйста, порекомендуйте.

Спасибо за ваше время и знания.

10

Решение

Просто слушайте правильное событие.
Обмен событиями содержит имя вашего сопоставления, чтобы вы могли реализовать для него конкретную логику, которая не повлияет на другие.

Событие в этом формате.

oneup_uploader.post_upload.{mapping}

В вашем случае это даст

oneup_uploader.post_upload.gallery

Для получения дополнительной информации, пожалуйста, прочитайте
https://github.com/1up-lab/OneupUploaderBundle/blob/master/Resources/doc/events.md

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]