You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:30:00