📜  vich uploader symfony 5 (1)

📅  最后修改于: 2023-12-03 14:48:19.115000             🧑  作者: Mango

使用 VichUploaderBundle 和 Symfony 5 中的上传器

VichUploaderBundle 是一个 Symfony 5 包,它简化了 Symfony 应用程序中的文件上传。 它提供了一个可重复使用的 UploaderTrait,用于向实体添加上传架构,以及一些用于提取上传文件的帮助程序。

安装

包可以使用 Composer 进行安装:

composer require vich/uploader-bundle

安装后,您应该将包启用在您的应用程序内,如下所示:

// config/bundles.php

return [
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
    // ...
    Vich\UploaderBundle\VichUploaderBundle::class => ['all' => true],
];
配置

在您的应用程序中启用该包后,您需要将其配置为使用您的实体。 您可以使用适当的配置文件完成此操作。 下面是使用 YAML 配置的例子:

# config/packages/vich_uploader.yaml

vich_uploader:
    db_driver: orm # orm, mongodb or phpcr
    mappings:
        # 您将要使用的映射名称/标识符
        uploader_mapping:
            # 用于此映射的实体类名
            uri_prefix: /uploads/images
            upload_destination: '%kernel.project_dir%/public/uploads/images'
            namer: Vich\UploaderBundle\Naming\UniqidNamer
            directory_namer: Vich\UploaderBundle\Naming\DirectoryNamer
            delete_on_remove: true
            delete_on_update: true
配置选项
  • db_driver: 这应该是 ormmongodbphpcr 中的一个,具体取决于使用何种框架或文档库。
  • mappings: 映射配置的列表。每个映射都有一个名字和其自身的配置选项。
  • uri_prefix: 上传文件的 URI 前缀,它将显示在实体上维护的“文件名”字段中。 示例中为 /uploads/images。
  • upload_destination: 将上传文件保存到的系统路径。 在本例中,我们将图像存储在应用程序的/public/uploads/images目录中。
  • namer: NamerInterface 的实例或服务名称,它将命名上传的文件。 在此示例中,我们使用了 UniqidNamer,它通过在文件名的基础上添加唯一的哈希值来创建唯一的文件名。
  • directory_namer: DirectoryNamerInterface 的实例或服务名称,它决定了上传文件的存放目录。 在本例中,我们使用了 DirectoryNamer 类。
  • delete_on_remove: 如果设置为 true,则文件将在实体从数据库中删除时自动删除。
  • delete_on_update: 如果设置为 true,则文件将在更改实体时自动删除。
使用

使用 VichUploaderBundle 和 Symfony 5 的步骤如下所示:

  1. Vich\UploaderBundle\Model\VichUploadable 特性添加到实体类中,并向其添加一个 $imageFile 属性来处理要上传的文件。
  2. 添加另一个 $imageName 属性,用于在数据库中存储文件名。
  3. UploaderTrait 应用于该实体,并在其上进行注释,以指定在 vich_uploader 中定义的映射。
use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
 * @ORM\Entity
 * @Vich\Uploadable
 */
class Product
{
   // ...

   /**
    * @ORM\Column(type="string", length=255, nullable=true)
    */
   private $imageName;

   /**
    * @Vich\UploadableField(mapping="uploader_mapping", fileNameProperty="imageName")
    */
   private $imageFile;

   // getters/setters关于imageName和imageFile属性的方法
}

此处,Uploadable trait 允许实体管理上传的文件,而 UploadableField 注释使该实体知道要使用哪些映射使用上传的文件。

表单

与 Symfony 5 的表单和文件上传有关的问题解决了:

  • 即使表单未提交,它也可以拥有一个上传的文件。
  • 已上传的文件不会在表单呈现中显示,并且无法删除。

表单示例:

use App\Entity\Product;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class ProductController extends AbstractController
{
    /**
     * @Route("/product/create", name="product_create")
     */
    public function create(Request $request): Response
    {
        $product = new Product();

        $form = $this->createFormBuilder($product)
            ->add('title')
            ->add('description')
            ->add('price')
            ->add('imageFile')
            ->getForm();

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($product);
            $entityManager->flush();

            return $this->redirectToRoute('product_show', ['id' => $product->getId()]);
        }

        return $this->render('product/create.html.twig', [
            'form' => $form->createView(),
        ]);
    }
}
结论

VichUploaderBundle 在 Symfony 5 应用程序中管理上传的文件变得更加容易。 它提供了许多固定过程,因此您将能够在没有太多干扰的情况下添加上传到您的应用程序中。