FMElfinderBundle 5 - как установить временную папку для загрузки

Я использую FMElfinderBundle v.5 (по некоторым причинам я не могу использовать последнюю версию) с Symfony 2.8.12. Я следил за документацией, и все работало нормально, пока не появился запрос на загрузку больших файлов (до 20 МБ). Я изменил параметр upload_max_size на 20M, и все было в порядке, но во время загрузки файлы разбиваются на куски по 2 МБ, и elfinder пытается сохранить их во временном каталоге. Проблема в том, что у него нет доступа туда. Он не считывает настройки из определения виртуального хоста, он всегда использует системную временную папку.

Читая документацию, я обнаружил, что для настройки временного каталога elfinder можно использовать два параметра - upload_temp_path и common_temp_path. Но мне не повезло с их установкой. Каждый раз, когда я запускаю в кэше команд консоли PHPStorm: clear --no-warmup, я получаю InvalidConfigurationException.

Я попытался поместить параметры в другое место в структуре конфигурации под ключом fm_elfinder, но все равно то же исключение.

Это моя конфигурация в config.yml:


    fm_elfinder:
        instances:
            default:
                locale: %locale%
                editor: ckeditor
                fullscreen: true
                theme: smoothness
                include_assets: true
                relative_path: false
                connector:
                    roots:
                        uploads:
                            driver: LocalFileSystem
                            path: uploads
                            upload_max_size: 20M

Кто-нибудь, пожалуйста, может мне помочь, как установить временный каталог?


person Trasher    schedule 18.10.2016    source источник


Ответы (2)


Хорошо, немного подробной информации:

Я взял ElFinderConfigurationReader из пакета ElFinder и сохранил его в своем проекте под именем ElFinderConfigurationCustomReader. Затем этот класс я определил как службу:

service.custom_fm_elfinder.configurator:
    class: CSBN\SVJBundle\Component\ElFinder\ElFinderConfigurationCustomReader
    arguments: ['%fm_elfinder%', '@request_stack', '@service_container', '%elfinder_temporary_path%']

переменная elfinder_temporary_path задается в параметрах.yml.

в config.yml я установил свой собственный считыватель конфигурации:

fm_elfinder:
configuration_provider: service.custom_fm_elfinder.configurator

И в моем только что созданном файле ElFinderConfigurationCustomReader я просто в методе getConfiguration добавил одну строку:

$options['uploadTempPath'] = $this->temporaryPath;

который берется из параметров сервиса в конструкторе.

Надеюсь, это поможет вам.

Изменить: полнофункциональная копия:

/**
 * @param $instance
 *
 * @return array
 */
public function getConfiguration($instance)
{
    $request                = $this->requestStack->getCurrentRequest();
    $efParameters           = $this->parameters;
    $parameters             = $efParameters['instances'][$instance];
    $options                = array();
    $options['corsSupport'] = $parameters['cors_support'];
    $options['debug']       = $parameters['connector']['debug'];
    $options['bind']        = $parameters['connector']['binds'];
    $options['plugins']     = $parameters['connector']['plugins'];
    $options['uploadTempPath'] = $this->temporaryPath;
    $options['roots']       = array();

    foreach ($parameters['connector']['roots'] as $parameter) {
        $path       = $parameter['path'];
        $homeFolder = $request->attributes->get('homeFolder');
        if ($homeFolder !== '') {
            $homeFolder = '/'.$homeFolder.'/';
        }

        $driver = $this->container->has($parameter['driver']) ? $this->container->get($parameter['driver']) : null;

        $driverOptions = array(
            'driver'            => $parameter['driver'],
            'service'           => $driver,
            'glideURL'          => $parameter['glide_url'],
            'glideKey'          => $parameter['glide_key'],
            'plugin'            => $parameter['plugins'],
            'path'              => $path.$homeFolder, //removed slash for Flysystem compatibility
            'startPath'         => $parameter['start_path'],
            'URL'               => $this->getURL($parameter, $request, $homeFolder, $path),
            'alias'             => $parameter['alias'],
            'mimeDetect'        => $parameter['mime_detect'],
            'mimefile'          => $parameter['mimefile'],
            'imgLib'            => $parameter['img_lib'],
            'tmbPath'           => $parameter['tmb_path'],
            'tmbPathMode'       => $parameter['tmb_path_mode'],
            'tmbUrl'            => $parameter['tmb_url'],
            'tmbSize'           => $parameter['tmb_size'],
            'tmbCrop'           => $parameter['tmb_crop'],
            'tmbBgColor'        => $parameter['tmb_bg_color'],
            'copyOverwrite'     => $parameter['copy_overwrite'],
            'copyJoin'          => $parameter['copy_join'],
            'copyFrom'          => $parameter['copy_from'],
            'copyTo'            => $parameter['copy_to'],
            'uploadOverwrite'   => $parameter['upload_overwrite'],
            'uploadAllow'       => $parameter['upload_allow'],
            'uploadDeny'        => $parameter['upload_deny'],
            'uploadMaxSize'     => $parameter['upload_max_size'],
            'defaults'          => $parameter['defaults'],
            'attributes'        => $parameter['attributes'],
            'acceptedName'      => $parameter['accepted_name'],
            'disabled'          => $parameter['disabled_commands'],
            'treeDeep'          => $parameter['tree_deep'],
            'checkSubfolders'   => $parameter['check_subfolders'],
            'separator'         => $parameter['separator'],
            'timeFormat'        => $parameter['time_format'],
            'archiveMimes'      => $parameter['archive_mimes'],
            'archivers'         => $parameter['archivers'],
        );

        if ($parameter['volume_id'] > 0) {
            $driverOptions['id'] = $parameter['volume_id'];
        }

        if (!$parameter['show_hidden']) {
            $driverOptions['accessControl'] = array($this, 'access');
        };

        $options['roots'][] = array_merge($driverOptions, $this->configureDriver($parameter));
    }

    return $options;
}
person Trasher    schedule 23.02.2017
comment
Спасибо. Меня беспокоит только ElFinderConfigurationCustomReader: у вас есть public function getConfiguration($instance) {$options['uploadTempPath'] = $this->temporaryPath; ... return $options;}? Не могли бы вы поместить весь метод getConfiguration()? Еще раз спасибо - person Overdose; 23.02.2017
comment
добавлено в предыдущий пост - person Trasher; 23.02.2017
comment
Большое спасибо. Просто последнее. на что похож ваш метод $this->getURL($parameter, $request, $homeFolder, $path),: как вы создаете свой URL? а также $this->configureDriver($parameter) Моя проблема в том, что мои изображения не отображаются, только значок elfinder. Они есть, загружены правильно, но я не могу их вставить. Я думаю, что это проблема URL/пути. Поэтому и прошу рабочее решение. Извините, если засорю вашу тему :'( - person Overdose; 24.02.2017
comment
наконец, с вашим кодом мне удается заставить его работать. Бесконечно благодарен. - person Overdose; 24.02.2017

Хорошо, я нашел решение. Необходимо сделать свой собственный считыватель конфигурации и заменить оригинальный. Класс конфигурации должен реализовывать ElFinderConfigurationProviderInterface. См. [https://github.com/helios-ag/FMElfinderBundle/blob/master/Resources/doc/advanced-configuration.md#custom-configuration-provider][1] для получения дополнительной информации.

person Trasher    schedule 25.10.2016
comment
Не могли бы вы поделиться своим результатом для класса ElfinderConfigurator? Я борюсь за то, чтобы он вернул действительную опцию. Спасибо - person Overdose; 23.02.2017
comment
Работает гладко - я добавил некоторые данные в другой ответ. - person Trasher; 23.02.2017