mindscreen/fal_upload

通过 Extbase 处理文件上传,灵感来自 helhum 的 upload_example

安装次数: 3,415

依赖: 0

建议者: 0

安全性: 0

星标: 0

关注者: 3

分支: 3

开放性问题: 0

类型:typo3-cms-extension

0.1.1 2018-09-06 13:49 UTC

This package is auto-updated.

Last update: 2024-08-28 15:47:42 UTC


README

.. post::
   :tags: TYPO3, Extbase


概览

它做什么?

这是一个简化在其他扩展中添加文件上传功能的扩展。

它如何工作?

  • 扩展的核心是 UploadedFileReferenceConverter
  • 需要一个扩展的 FileReference 模型
  • 需要一个扩展的 ObjectStorageConverter
  • 需要一个扩展的 UploadViewHelper

需要做什么?

类型转换器

我们希望有一个自定义的类型转换器来

  • 评估文件上传数组
  • 使用 FAL API 将上传的文件移动到 FAL 存储中
  • 并使用 Extbase 持久化将结果持久化到数据库中。

错误处理

我们不想只是抛出异常,而是使用类型转换器 API 向用户返回有用的错误信息。

可配置性

应该可以进行配置,特别是类型转换器。它需要知道

  1. 上传到的文件夹
  2. 在文件名冲突的情况下要做什么
  3. 允许的文件扩展名
  4. 如何处理已附加的资源。

实际的配置是通过 PropertyMappingConfiguration 实现的。

一些配置选项

<?php
class UploadedFileReferenceConverter extends \TYPO3\CMS\Extbase\Property\TypeConverter\AbstractTypeConverter {

   /**
    * Folder where the file upload should go to
    * (including storage).
    */
   const CONFIGURATION_UPLOAD_FOLDER = 1;

   /**
    * How to handle an upload when the name
    * of the uploaded file conflicts.
    */
   const CONFIGURATION_UPLOAD_CONFLICT_MODE = 2;

   /**
    * Whether to replace an already present resource.
    * Useful for "maxitems = 1" fields and properties
    * with no ObjectStorage annotation.
    */
   const CONFIGURATION_ALLOWED_FILE_EXTENSIONS = 4;
}

处理验证错误和已附加的资源

需要处理不同的案例。

案例:文件已附加

  • 当编辑已有一个图像附加到的实体时,例如通过之前的上传,保存实体而不重新上传文件应保留附加的资源。

了解已附加的资源不仅属于类型转换器的领域。因此,UploadViewHelper 将这些值分配给隐藏输入,并使用哈希值(hmac)进行保护。

此外,viewhelper 还接受子节点并提供一个“资源”对象。这意味着如果您愿意,可以渲染附加的资源。在这个例子中显示了图像的预览

<h:form.upload property="image" >
   <f:if condition="{resource}">
      <f:image image="{resource}" alt="" width="50"/>
   </f:if>
</h:form.upload><br />

案例:上传成功,验证失败

在这种情况下,文件上传成功,但由于某些其他字段中的验证错误,整个表单没有被接受。这也意味着它还没有被持久化,但我们仍然想保留上传的文件作为资源,因为我们不想再次上传。

安全性

为了使文件上传安全,类型转换器至少需要关注这两个问题

  1. 禁止上传 PHP 文件!

    <?php
    if (!GeneralUtility::verifyFilenameAgainstDenyPattern($uploadInfo['name'])) {
       throw new TypeConverterException('Uploading files with PHP file extensions is not allowed!', 1399312430);
    }

    这三行代码的重要性怎么强调都不过分!

    重要

    • 这些行是强制性的,而不是可选的。
    • 这些行与可配置的允许文件扩展名无关。

安装

  1. 从 Github 获取,作为扩展安装
  2. 创建文件夹 ./fileadmin/content
  3. 不需要包含额外的 TypoScript
  4. 创建一个扩展并使用插件提供的类
  5. 开始玩耍

适配

  • 查看控制器以了解如何配置类型转换器。
  • 查看 TCA 以了解如何正确设置 match_fields 以确保 Extbase 持久化执行正确操作。
  • ...

贡献

享受乐趣!