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].

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

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

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

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

код

мои услуги.в формате YML

services:
    app.upload_listener:
        class: AppBundleEventListenerUploadListener
        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: AppBundleUploaderNamingUploadUniqueNamer
        arguments: ["@session"]

мое пользовательское имя

<?php

namespace AppBundleUploaderNaming;

use OneupUploaderBundleUploaderFileFileInterface;
use OneupUploaderBundleUploaderNamingNamerInterface;
use SymfonyComponentHttpFoundationSessionSession;

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

мой конфиг.в формате 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 AppBundleEventListener;

use OneupUploaderBundleEventPreUploadEvent;
use OneupUploaderBundleEventPostUploadEvent;
use OneupUploaderBundleEventPostPersistEvent;
use DoctrineORMEntityManager;
use AppBundleEntityProduct;

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

загрузить.формат html.прутик!--21-->

{% 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) проверки, которые я добавил, пытаясь сделать это работа...

вывод

посоветуйте, пожалуйста.

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

1 ответов


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

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

oneup_uploader.post_upload.{mapping}

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

oneup_uploader.post_upload.gallery

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