makinacorpus / filechunk-bundle
用于 Symfony 的 JavaScript 文件上传小部件和表单类型
Requires
- php: >=8.0
- makinacorpus/files: ^1.0.1
- symfony/dependency-injection: ^5.4|^6.0
- symfony/event-dispatcher: ^5.4|^6.0
- symfony/framework-bundle: ^5.4|^6.0
- symfony/mime: ^5.4|^6.0
Requires (Dev)
- phpunit/phpunit: ^9.0
- symfony/form: ^5.4|^6.0
- symfony/validator: ^5.4|^6.0
- dev-master
- 3.0.2
- 3.0.1
- 3.0.0
- 3.0.0-alpha1
- 2.x-dev
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 2.0.0-alpha16
- 2.0.0-alpha15
- 2.0.0-alpha14
- 2.0.0-alpha13
- 2.0.0-alpha12
- 2.0.0-alpha11
- 2.0.0-alpha10
- 2.0.0-alpha9
- 2.0.0-alpha8
- 2.0.0-alpha7
- 2.0.0-alpha6
- 2.0.0-alpha5
- 2.0.0-alpha4
- 2.0.0-alpha3
- 2.0.0-alpha2
- 2.0.0-alpha1
- 1.x-dev
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- 1.0.0-beta7
- 1.0.0-beta6
- 1.0.0-beta5
- 1.0.0-alpha9
- 1.0.0-alpha8
- 1.0.0-alpha7
- 1.0.0-alpha6
- 1.0.0-alpha5
- 1.0.0-alpha4
- 1.0.0-alpha3
- 1.0.0-alpha2
- 1.0.0-alpha1
- 0.x-dev
- dev-prevent-checksum
This package is auto-updated.
Last update: 2024-08-29 10:40:38 UTC
README
此包提供了一种分块文件上传端点,该端点专为与https://github.com/makinacorpus/filechunk-front小部件一起使用而定制,但也可能被任何其他组件使用。
分块文件上传端点允许
- 非常大的文件上传
- 恢复中断的上传
- 绕过大多数 HTTP 对文件上传的限制(大小、超时)
- 避免 PHP 文件上传机制
- 易于与自定义表单类型一起使用,该类型可以输入和输出
File
实例或字符串 URI。
与外部 JavaScript 小部件一起工作的已知浏览器
- Chrome <= 49
- Edge <= 13
- IE <= 11
- Firefox <= 33
- 可能还有其他浏览器,因为它只使用 FileReader API 的一小部分。
设置
安装
composer require makinacorpus/filechunk-bundle
当前版本不包含关联的 JavaScript 小部件,您必须从以下位置安装它:https://github.com/makinacorpus/filechunk-front
如果您的环境是 Drupal 7,您可以选择安装以下模块: https://github.com/makinacorpus/drupal-filechunk 而不是手动注册 JavaScript 小部件。
基本配置
如果按照本节剩余部分操作,所有内容都应该自动配置。
自定义方案配置
每个自定义方案都与一个自定义文件夹相关联,允许您在数据库中存储协议相对 URI 而不是绝对路径,从而使应用程序易于迁移。
默认情况下,该包提供以下三个方案
private://
用于不应通过 HTTPd 访问的文件,默认为%kernel.project_dir/var/private/%
public://
用于将通过 HTTPd 自由访问的文件,默认为%kernel.project_dir/public/files/
temporary://
用于临时文件,默认为 PHP 配置的临时文件夹upload://
用于分块文件上传,默认为temporary://filechunk/
webroot://
用于位于公共目录中的文件,默认为%kernel.project_dir/public
只有临时方案不能配置,所有其他方案都可以通过以下 .env
文件变量设置
FILE_PRIVATE_DIR="%kernel.project_dir%/var/private"
FILE_PUBLIC_DIR="%kernel.project_dir%/public/files"
FILE_UPLOAD_DIR="%kernel.project_dir%/var/tmp/upload"
FILE_WEBROOT_DIR="%kernel.project_dir%/public"
分块文件上传小部件配置
在您的 config/routes.yaml
文件中注册 routing.yml 文件
filechunk: resource: "@FilechunkBundle/Resources/config/routing.yml" prefix: /
并在您的 config/packages/twig.yaml
文件中注册相关的表单主题
twig: debug: "%kernel.debug%" strict_variables: false form_themes: # ... - "FilechunkBundle:Form:fields.html.twig"
然后它可能应该工作。
用法
文件管理器 API
文档将很快提供。
文件小部件
基本用法
只需在您的自定义表单构建器中使用 MakinaCorpus\FilechunkBundle\Form\Type\FilechunkType
表单类型。
默认值 必须 是 Symfony\Component\HttpFoundation\File\File
实例,返回的值也将是。
验证
您可以使用 Symfony\Component\Validator\Constraints\File
文件约束来验证您的文件。
$this ->createFormBuilder() ->add('photo', FilechunkType::class, [ 'label' => "Photo", 'multiple' => false, 'required' => true, 'constraints' => [ new Assert\NotBlank(), new Assert\File(['mimeTypes' => ['image/jpg', 'image/jpeg', 'image/png', 'application/pdf']]), ], ])
多值注意事项
当使用 multiple
属性设置为 true 时,不能仅应用 Assert\File
验证器,如果这样做,由于小部件将返回一个文件数组,验证器将失败。为了解决这个问题,以下是一个实际工作示例,说明如何转换之前的示例
$this ->createFormBuilder() ->add('photo', FilechunkType::class, [ 'label' => "Photo", 'multiple' => false, 'required' => true, 'constraints' => [ new Assert\NotBlank(), new All([ 'constraints' => [ new Assert\File(['mimeTypes' => ['image/jpg', 'image/jpeg', 'image/png', 'application/pdf']]), ], ]), ], ])
你可以在那里找到更好的解释:http://blog.arithm.com/2014/11/24/validating-multiple-files-in-symfony-2-5/
使用验证组处理多个值
与上面相同,但你还有验证组,你需要在整个验证器链中关联这些组,方式如下
$this ->createFormBuilder() ->add('photo', FilechunkType::class, [ 'label' => "Photo", 'multiple' => false, 'required' => true, 'constraints' => [ new Assert\NotBlank([ 'groups' => ['some', 'group'], ]), new All([ 'groups' => ['some', 'group'], 'constraints' => [ new Assert\File( 'groups' => ['some', 'group'], 'mimeTypes' => ['image/jpg', 'image/jpeg', 'image/png', 'application/pdf'], ]), ], ]), ], ])
重要注意事项
-
如果你通过表单数据提供默认值,并通过 HTML 页面的 UI 移除它,你将无法获取已删除的文件列表,你必须手动处理这个问题:这将是未来要实现的第一项功能之一;
-
上传的文件不是 PHP 上传的文件,而是你临时文件夹中的常规文件,你需要手动移动它们(你不能使用
move_uploaded_file()
PHP 函数); -
你需要最新的浏览器。
基本上就是这样,祝您玩得开心!