mindscreen / fal_upload
通过 Extbase 处理文件上传,灵感来自 helhum 的 upload_example
0.1.1
2018-09-06 13:49 UTC
Requires
- typo3/cms-core: >=7.5.0,<9.0
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 向用户返回有用的错误信息。
可配置性
应该可以进行配置,特别是类型转换器。它需要知道
- 上传到的文件夹
- 在文件名冲突的情况下要做什么
- 允许的文件扩展名
- 如何处理已附加的资源。
实际的配置是通过 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 />
案例:上传成功,验证失败
在这种情况下,文件上传成功,但由于某些其他字段中的验证错误,整个表单没有被接受。这也意味着它还没有被持久化,但我们仍然想保留上传的文件作为资源,因为我们不想再次上传。
安全性
为了使文件上传安全,类型转换器至少需要关注这两个问题
禁止上传 PHP 文件!
<?php if (!GeneralUtility::verifyFilenameAgainstDenyPattern($uploadInfo['name'])) { throw new TypeConverterException('Uploading files with PHP file extensions is not allowed!', 1399312430); }
这三行代码的重要性怎么强调都不过分!
重要
- 这些行是强制性的,而不是可选的。
- 这些行与可配置的允许文件扩展名无关。
安装
- 从 Github 获取,作为扩展安装
- 创建文件夹 ./fileadmin/content
- 不需要包含额外的 TypoScript
- 创建一个扩展并使用插件提供的类
- 开始玩耍
适配
- 查看控制器以了解如何配置类型转换器。
- 查看 TCA 以了解如何正确设置 match_fields 以确保 Extbase 持久化执行正确操作。
- ...
贡献
享受乐趣!