如何删除文章同时删除Summernote上传的图片?
解决删除文章时同步删除Summernote上传图片的问题
核心思路
从文章的content字段中提取所有Summernote上传的图片路径,逐个删除服务器上的对应文件;同时清理文章关联的主图(基于你使用的Laravel Media Library),最后执行文章删除操作。
修改后的destroy方法代码
public function destroy(Post $post) { // 1. 处理Summernote编辑器内的图片 $dom = new \DomDocument(); // 加载文章内容,避免自动补全html/body标签 $dom->loadHtml($post->content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $images = $dom->getElementsByTagName('img'); foreach ($images as $image) { $src = $image->getAttribute('src'); // 仅处理本站summernote上传的图片,跳过外部链接图 if (str_starts_with($src, '/summernoteUploads/')) { $filePath = public_path($src); // 文件存在时再删除,避免报错 if (file_exists($filePath)) { unlink($filePath); } } } // 2. 删除文章关联的主图(对应store方法里的addMedia操作) $post->clearMediaCollection(); // 3. 最后删除文章本身 $post->delete(); return redirect()->back()->with('status', 'Post Deleted Successfully'); }
补充说明
str_starts_with用于过滤路径前缀,确保只删除我们服务器上的Summernote图片,不会误操作外部链接的图片- 先判断
file_exists再删除,避免因文件已被手动删除等情况抛出异常 - 如果你给主图指定了媒体集合名称,可改用
clearMediaCollection('你的集合名')来精准删除
内容的提问来源于stack exchange,提问作者Alphy Gacheru
相关产品推荐
相关产品推荐

