【问题标题】:How to upload a file with TYPO3 Fluid form.upload and pass it to Extbase controller如何使用 TYPO3 Fluid form.upload 上传文件并将其传递给 Extbase 控制器
【发布时间】:2020-01-13 15:03:18
【问题描述】:

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

【问题讨论】:

    标签: typo3 fluid extbase typo3-9.x


    【解决方案1】:

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

    $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
    

    【讨论】:

    • 您可能还想查看 helhums 上传示例:github.com/helhum/upload_example 它处理将上传映射到模型并处理表单存在验证错误的情况。
    • 我从 Helmuts 实现转移到使用与 Sybille 使用的类似方法,但略有改进。我为上传数组创建了一个模型,并且能够使用 extbase 验证器来检查文件大小、文件类型和上传错误。我发现这种方法更简洁,然后像 Helmut 那样在上传时直接将上传的文件转换为 FileReference。
    猜你喜欢
    • 2013-04-30
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多