如何正确删除使用 sonata-media-bundle 上传的所有图像

Posted

技术标签:

【中文标题】如何正确删除使用 sonata-media-bundle 上传的所有图像【英文标题】:How to correctly delete all images uploaded using sonata-media-bundle 【发布时间】:2014-11-14 13:17:15 【问题描述】:

按照here的建议,我已经使用 sonata-media-bundle 上传了一些图片

$media = new Media;
$media->setBinaryContent($file->getRealPath());
$media->setContext('myContext'); 
$media->setProviderName('sonata.media.provider.image');
$mediaManager->save($media);

之前的代码正确地创建了媒体所有文件(根据上下文配置)和数据库注册表。现在我删除媒体的方法是这样调用的:

$media = $mediaManager->findOneBy(array('id' => $id));
$mediaManager->delete($media)

它正确地从数据库中删除了媒体数据,但没有从配置的文件系统中删除,仍有一些图像与上传的媒体相关联。我正在计划使用 S3 文件系统,所以我需要使用相同的框架删除所有文件系统

我最相关的奏鸣曲配置(也使用建议的)是这样的:

sonata_media: default_context: default db_driver: doctrine_orm class: media: MyApp\MediaBundle\Entity\Media gallery: MyApp\MediaBundle\Entity\Gallery gallery_has_media: MyApp\MediaBundle\Entity\GalleryHasMedia contexts: default: providers: - sonata.media.provider.youtube - sonata.media.provider.image - sonata.media.provider.file formats: small: width: 200, quality: 77 myContext: providers: - sonata.media.provider.image formats: normal: width: 350, quality: 75 tmb: width: 100, quality: 75 filesystem: local: directory: %kernel.root_dir%/../web/uploads/media create: false

提前致谢。

【问题讨论】:

【参考方案1】:

为了能够正确删除与上传文件相关的所有媒体,必须使用适当的提供程序:

来自奏鸣曲媒体documentation

提供者类负责处理与媒体资产相关的常见事物:

缩略图 路径 使用表单编辑媒体 存储媒体信息(元数据)

所以代码看起来像:

$media = $mediaManager->findOneBy(array('id' => $id));
//assuming you have access through $this->get to the service container
$provider = $this->get($media->getProviderName());
$provider->removeThumbnails($media);
$mediaManager->delete($media)

【讨论】:

以上是关于如何正确删除使用 sonata-media-bundle 上传的所有图像的主要内容,如果未能解决你的问题,请参考以下文章

使用后如何正确删除信号量?

如何使用 React 从 MongoDB 数组中正确删除用户?

如何正确使用自定义 shared_ptr 删除器?

如何使用 XSLT 正确删除 XML 标记

如何使用自定义 tableviewcells 正确添加和删除对象到 tableview?

如何从 Grails 中正确删除 H2