首页 > 解决方案 > 如何使用 TYPO3 Fluid form.upload 上传文件并将其传递给 Extbase 控制器

问题描述

我正在使用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 对象包含一个文件名,但该文件不存在。

标签: typo3fluidextbasetypo3-9.x

解决方案


我的问题是,该文件在处理时已被删除。我重定向到我的控制器操作中的另一个操作,这开始了一个新请求。

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

如果该文件未被移走或重命名,则该文件将在请求结束时从临时目录中删除。

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

文件的上传方式不是 TYPO3 特定的,可以采用不同的方式处理,请参见上面的链接。

  • 您还应该相应地设置临时路径,请参见上面的链接。
  • 文件类型可以通过接受来限制,例如accept='text/csv'

我在后端模块中使用它。以下代码有效。

体液

<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

推荐阅读