переименовать файл, который не удалось импортировать с помощью InputFilter

Я не совсем уверен, как правильно спросить об этом. Я импортирую несколько файлов за один раз. Имена файлов включают соответствующие системы, которым принадлежат файлы. Это работает до сих пор вполне нормально. Но будут файлы без совпадений, потому что система не найдена. Мне нужно пометить их, чтобы пользователь мог проверить.

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

Мой InputFilter выполняет импорт в нужное место для соответствующих файлов.

$inputFilter->add([
            'type'     => 'Zend\InputFilter\FileInput',
            'name'     => 'PAD_Document_Path',  // Element's name.
            'required' => true,    // Whether the field is required.
            'filters'  => [        // Filters.
                    [
                            'name' => \Zend\Filter\File\RenameUpload::class,
                            'options' => [
                                    'use_upload_name'=>true,
                                    'use_upload_extension' => true,
                                    'randomize' => false,
                                    'overwrite' => true,
                                    'target' => './public/files/pads',
                            ],
                    ],
            ],
            'validators' => [      // Validators.
                    [
                            'name' => \Zend\Validator\File\Extension::class,
                            'options' => [
                                    'extension' => 'pdf',
                                    'message' => 'File extension not match',
                            ],
                    ],
                    [
                            'name' => \Zend\Validator\File\MimeType::class,
                            'options' => [
                                    'mimeType' => 'application/pdf',    //'text/xls', 'text/xlsx',
                                    'message' => 'File type not match',
                            ],
                    ],
                    [
                            'name' => \Zend\Validator\File\Size::class,
                            'options' => [
                                    'min' => '1kB',  // minimum of 1kB
                                    'max' => '8MB',
                                    'message' => 'File too large',
                            ],
                    ],
            ]
    ]);

Итак, могу ли я использовать InputFilter также для импорта файлов без совпадения? Если это невозможно, то какой путь будет лучшим?

И другая идея состоит в том, чтобы вообще не импортировать не соответствующие файлы, но тогда мне нужно будет переименовать их в системе клиентов. Наверное, это невозможно, не так ли?

Надеюсь, я объяснил это правильно, чтобы все могли понять.


person pia-sophie    schedule 11.10.2018    source источник
comment
Я думаю, что это было бы неправильным использованием InputFilter, который должен подтвердить правильность загруженного файла, а не то, что с ним делать. На мой взгляд, вам придется обрабатывать это в контроллере или службе для обработки файлов. Затем вы можете подвергнуть сомнению любую логику, обрабатывающую это, чтобы увидеть, соответствуют ли какие-либо критерии необходимости дальнейших действий, и если да, то сделайте это, иначе перейдите к следующему шагу.   -  person rkeet    schedule 11.10.2018
comment
Но рекомендуется, чтобы InputFilter давал цель копии файла в случае успеха. (Зенд-учебник). У вас есть идея для меня, что делать с несоответствующими файлами?   -  person pia-sophie    schedule 12.10.2018
comment
Это верно, поскольку для загрузки (загрузки для клиента, загрузки для сервера) требуется пункт назначения (tmp). Однако не будет ли проще поместить их все во временное хранилище (опция target), а затем использовать некоторую логику для определения того, какие из них совпадают, а какие нет? Делая это в параметрах фильтра и/или валидатора, вы используете их для цели, для которой они не предназначены.   -  person rkeet    schedule 12.10.2018
comment
хорошо понял, но если мы вернемся на шаг назад, прежде чем импортировать. Тогда это точка проверки, если вы хотите переименовать в этот момент, как бы вы это сделали?   -  person pia-sophie    schedule 12.10.2018
comment
Ну, есть это, но оно устанавливает правила для всех файлы. Таким образом, я бы создал одно правило, а затем, после проверки формы, обрабатывал полученное содержимое. Предположительно в контроллере, где я бы различал файлы, соответствующие условиям (как вы указали в первом абзаце вашего вопроса), и те, которые не соответствуют. С первым я бы справился в счастливом потоке, чего я и ожидал в первую очередь. Последний останется в каталоге tmp (загрузка) (1/2)   -  person rkeet    schedule 12.10.2018
comment
...каталог. Если в каталоге tmp есть какие-либо из-за этой загрузки (этой конкретной, т.е. принадлежащей загружающему пользователю), то пользователь перенаправляется на страницу, где ему нужно выбрать, какие они / где они должны быть размещены. Например, загружаются файлы от A до F. A и B в порядке, они соответствуют системам X и Y. Остальные не могут быть сопоставлены. Пользователь перенаправляется на страницу, где он должен выбрать для каждого файла, является ли файл для X или для Y. Затем переместите (при необходимости переименуйте, см. ссылку в предыдущем комментарии) файлы в качестве исправления. (2/2)   -  person rkeet    schedule 12.10.2018
comment
это хорошая идея, пожалуйста, опубликуйте ее как ответ, чтобы я мог ее принять   -  person pia-sophie    schedule 12.10.2018


Ответы (1)


Из-за обсуждения комментариев ниже вопроса мы пришли к возможному решению.

(пожалуйста, попробуйте, иначе добавьте свой ответ, когда решите его)


если мы сделаем шаг назад, прежде чем импортировать. Тогда это точка проверки, если вы хотите переименовать в этот момент, как бы вы это сделали?

В документах показаны варианты переименования файлов, в том числе путем установки целевое место для них. Однако это правило действует для всех файлов.

Вы должны создать правило, подобное этому, для единообразной проверки файлов. Когда вам нужно отправить файлы в определенные места на основе критериев, например. имена файлов, то вы должны создать эту логику после проверки формы. Например, в классе контроллера. В этом контроллере вы обрабатываете файлы, соответствующие требованиям вашего «счастливого потока», и оставляете во временном хранилище те, которые не соответствуют требованиям.

Если какие-либо файлы не совпадают, вы перенаправляете пользователя в место, где он должен решить, для чего предназначены файлы и/или что с ними делать. Если файлов нет, вы продолжаете как обычно для счастливого потока вашего приложения.

Пример потока:

  1. Файлы от A до F загружены.
  2. A и B в порядке, они согласованы и перемещены для систем X и Y.

Альтернативный поток для файлов (от C до F), не совпадающих после 2 выше

  1. Остаток не может быть сопоставлен.
  2. Пользователь перенаправляется на страницу, где он должен выбрать для каждого файла, предназначен ли файл для X или для Y.
  3. Переместите файлы в качестве исправления к выбранным параметрам
person rkeet    schedule 13.10.2018