Laravel 8 如何删除storage文件夹内的课程PDF文件
问题排查及修复方案
核心问题点
- 拼接文件路径时错误使用了
$lesson模型对象,没有指定存储PDF文件名的lesson_pdf字段,生成的路径完全错误,自然找不到目标文件 $image_path变量没有赋值就直接用于文件存在性判断,判断逻辑永远不生效,对应的删除代码不会执行- 没有做文件存在判断就直接调用
unlink,如果路径错误会直接抛出PHP错误 - 重复声明了
namespace App\Http\Controllers;命名空间(虽然不影响删除逻辑,但属于冗余代码,建议删除)
修复后的控制器DeletePDF方法
public function DeletePDF($id) { $lesson = LessonPDF::find($id); if(is_null($lesson)){ return response()->json('Record not found!', 404); } // 先判断字段是否为空,避免删除空路径 if (!empty($lesson->lesson_pdf)) { $filePath = 'public/uploads/' . $lesson->lesson_pdf; // 用Laravel自带的Storage门面处理删除,不需要手动拼接系统路径,兼容性更好 if (Storage::exists($filePath)) { Storage::delete($filePath); } } $lesson->update(['lesson_pdf' => null]); return response('PDF Deleted', 200); }
额外说明
- 原来注释的
Storage::delete逻辑本身是正确的,只需要补全文件路径前缀即可,比手动调用unlink更符合Laravel的编码规范,也能避免不同操作系统路径分隔符的差异问题 - 如果后续需要支持切换存储驱动(比如改存到OSS、S3等对象存储),用Storage门面不需要修改业务逻辑,兼容性更好
- 原代码里返回记录不存在的状态码用了401(未授权),修复后改成了更符合语义的404(资源不存在)
内容的提问来源于stack exchange,提问作者user16621915
相关产品推荐
相关产品推荐

