Как загрузить файл с TYPO3 Fluid form.upload и передать его в контроллер Extbase - PullRequest
2 голосов
/ 13 января 2020

Я использую form.upload ViewHelper для загрузки файла.

<f:form enctype="multipart/form-data" action="list" name="import" object="{import}" method="POST">
    <f:form.upload name="file" property="file" />
    <f:form.submit value="Submit" />
</f:form>

Проблема в доступе к файлу. Объект $ import содержит имя файла, но файл не существует.

1 Ответ

2 голосов
/ 13 января 2020

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

$this->redirect('list', $import);

Файл будет удален из временного каталога в конце запроса, если он не был удален или переименован.

(https://www.php.net/manual/en/features.file-upload.post-method.php)

Способ загрузки файла не указан в TYPO3 c и может обрабатываться по-другому, см. ссылку выше.

  • Вы также должны установить временный путь соответственно, см. Ссылку выше.
  • типы файлов могут быть ограничены с помощью accept, например, accept='text/csv'

Я использую это в бэкэнд-модуле. Работает следующий код.

Fluid

<f:form enctype="multipart/form-data" action="create" name="import" object="{import}" method="POST">
    <f:form.upload name="file" property="file" />
    <f:form.submit value="Submit" />
</f:form>

Класс модели: Import. php

class Import extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
{
    /** @var array */
    protected $file = [];

    /**
     * @return array
     */
    public function getFile()
    {
        return $this->file;
    }

    /**
     * @param array $file
     * @return void
     */
    public function setFile(array $file)
    {
        $this->file = $file;
    }
}

Контроллер createAction ()

/**
 * @param Import $import
 * @return void
 */
public function createAction(Import $import)
{
    $file = $import->getFile(); 
    if ($file) {
        $path = $file['tmp_name'];     
    }
    // ...
}

Действие вызывается с объектом Import, содержащим свойство файла с правильно заполненными метаданными, например,

['name'] = myfile.csv
['type'] = 'text/csv'
['tmp_name'] = '/tmp/hpGLv1E' 
['error'] = 0
['size'] = 51550
...