tacoberu/nette-form-fileupload

上传文件有其特殊性。仅仅上传文件是不够的。我们还想在上传后展示它(最好有预览)。我们可能想要删除它或用另一个版本替换它。

v1.0.1 2024-05-16 00:22 UTC

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 实现的问题。