tacoberu / nette-form-fileupload
上传文件有其特殊性。仅仅上传文件是不够的。我们还想在上传后展示它(最好有预览)。我们可能想要删除它或用另一个版本替换它。
v1.0.1
2024-05-16 00:22 UTC
Requires
- php: >=8.1
- nette/forms: ^3.2
Requires (Dev)
- phpstan/phpstan: ^1.10
This package is auto-updated.
Last update: 2024-09-18 03:42:54 UTC
README
上传文件很简单。但如果系统已经上传了文件,我们可能
- 只显示它(最好有预览),
- 或删除文件,
- 或用另一个版本替换文件。
有时会遇到不太方便的情况,比如表单中的其他地方出现了一些无关的错误。因此,我们返回表单让用户进行更正。但上传的文件或文件必须重新启动。我们通过事务解决这个问题。一旦上传,文件就存储在特殊的存储中(默认情况下,它作为temp目录处理,可以更改),并在表单成功保存后进入系统。
我们将图像文件表示为图像。如果不适合标准的渲染器,我们可以设置自己的。
输入值有三个选项
Null:无,或原始文件被删除FileUploaded:新文件已上传FileCurrent:存储在系统中的原始文件
安装
composer require tacoberu/nette-form-fileupload
使用
use Taco\Nette\Forms\Controls\FileCurrent; use Taco\Nette\Forms\Controls\FileControl; use Taco\Nette\Forms\Controls\GenericFilePreviewer; $form = new Nette\Forms\Form; $form['portrait'] = (new FileControl('Portrait:')) ->setDefaultValue(new FileCurrent("uploaded/account/56695/mp16.jpg", "image/jpeg")) ->setPreviewer(new GenericFilePreviewer());
事务
当文件成功上传到服务器时,它将自动移动到存储中,进行事务处理。这有助于如果表单未处理,但例如,因为验证原因返回给用户,则不需要再次上传文件。成功处理后,文件可以通过 $control->getValue() 使用,就像其他值一样。
文件上传到系统后,可以丢弃事务。好吧,在使用默认存储 UploadStoreTemp 的情况下,删除目录。我们可以明确地这样做
$form['portrait']->destroyStore();
或者让它由GC处理,它将在一定时间后自动删除。
UploadStoreTemp,GC
在 UploadStoreTemp 中实现了自动清理。页面退出后,所有相关事务都会通过析构函数传递,并检查事务是否早于 UploadStoreTemp::$gcAgeLimit。这只会删除 UploadStoreTemp::$gcMaxCount 事务/目录,以分散负载。
这种行为仅仅是 UploadStoreTemp 实现的问题。