makinacorpus/filechunk-bundle

用于 Symfony 的 JavaScript 文件上传小部件和表单类型

安装次数: 6,636

依赖: 0

建议者: 0

安全: 0

星标: 1

关注者: 14

分支: 0

开放问题: 0

类型:symfony-bundle

3.0.2 2023-06-28 08:14 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 函数);

  • 你需要最新的浏览器。

基本上就是这样,祝您玩得开心!