Laravel 8项目berita.blade.php页面上传的新闻图片无法显示问题排查
问题出现原因
- 核心错误:
$request->file('foto')->store('public')返回的是文件存储路径的字符串,并非UploadedFile实例,后续代码调用getClientOriginalName()、move()方法都会直接报错,文件根本无法正常上传。 - 存储逻辑冲突:调用
store('public')默认会将文件存储到storage/app/public目录,后续又尝试将文件移动到public/img目录,路径逻辑完全不匹配,就算上传成功也找不到文件。 - 前端标签问题:你提供的blade代码里img标签缺少闭合的尖括号,也会导致图片无法正常渲染。
- 文件名风险:直接使用原文件名存储,遇到同名文件会直接覆盖旧文件,会出现图片和内容不匹配的问题。
解决方案
1. 修正Controller的store方法
替换原有store方法为以下代码:
public function store(Request $request) { // 先做请求校验,确保上传的是合法图片,同时判断新闻标题是否重复 $request->validate([ 'foto' => 'required|image|max:2048', 'judul_berita' => 'required|unique:beritas,judul_berita', 'jenis_berita' => 'required', 'isi_berita' => 'required' ]); // 生成不重复的文件名,避免同名文件覆盖 $originalName = $request->file('foto')->getClientOriginalName(); $fileName = pathinfo($originalName, PATHINFO_FILENAME) . '_' . time() . '.' . $request->file('foto')->getClientOriginalExtension(); // 直接将文件移动到public/img目录 $request->file('foto')->move(public_path('img'), $fileName); // 写入数据到数据库 Berita::create([ 'jenis_berita' => $request->jenis_berita, 'judul_berita' => $request->judul_berita, 'isi_berita' => $request->isi_berita, 'foto' => $fileName ]); Alert::success('Berhasil Tambah Berita', 'Silahkan Periksa Kembali'); return redirect()->back(); }
注意:如果你的Berita模型没有设置$fillable批量赋值白名单,需要先在模型里加上对应的字段,否则create方法会报错。
2. 修正blade模板的图片标签
<img src="{{ asset('img/' . $berita->foto) }}" height="50" width="50" alt="Foto Berita">
3. 额外检查项
- 确认
public目录下存在img文件夹,且文件夹权限设置为755,确保web服务器有读写权限 - 确认
.env文件中的APP_URL配置和你实际访问项目的域名/地址一致 - 如果存在之前上传的历史数据,需要手动把对应图片移到
public/img目录,或者批量更新数据库中foto字段值和实际文件名匹配
内容的提问来源于stack exchange,提问作者fhia
相关产品推荐
相关产品推荐

