📅  最后修改于: 2023-12-03 14:48:19.115000             🧑  作者: Mango
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
orm
、mongodb
或 phpcr
中的一个,具体取决于使用何种框架或文档库。NamerInterface
的实例或服务名称,它将命名上传的文件。 在此示例中,我们使用了 UniqidNamer
,它通过在文件名的基础上添加唯一的哈希值来创建唯一的文件名。DirectoryNamerInterface
的实例或服务名称,它决定了上传文件的存放目录。 在本例中,我们使用了 DirectoryNamer
类。true
,则文件将在实体从数据库中删除时自动删除。true
,则文件将在更改实体时自动删除。使用 VichUploaderBundle 和 Symfony 5 的步骤如下所示:
Vich\UploaderBundle\Model\VichUploadable
特性添加到实体类中,并向其添加一个 $imageFile
属性来处理要上传的文件。$imageName
属性,用于在数据库中存储文件名。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 应用程序中管理上传的文件变得更加容易。 它提供了许多固定过程,因此您将能够在没有太多干扰的情况下添加上传到您的应用程序中。