Laravel 上传图片存储到非public目录后前端仅显示缩略图问题求助
Laravel 上传图片仅显示缩略图问题修复方案
核心问题原因
你执行的php artisan storage:link命令仅用于将项目的storage/app/public目录映射到public/storage目录,而你当前把上传文件存放在项目根目录的Uploads文件夹中,该目录并未和public目录建立访问映射,所以asset()函数无法正确读取到对应文件,最终导致图片加载失败仅显示缩略图标。
可选解决方案
方案1:调整上传路径到Laravel默认公共存储目录(推荐)
该方案符合Laravel官方文件存储规范,安全性更高:
- 修改上传控制器存储路径:
$file = $request->file('images')->getClientOriginalName(); $filename = time().$file; // 路径调整为storage下的公共可访问目录 $path = storage_path('app/public/Uploads'); if($request->hasFile('images')){ $file = $request->file('images'); $file->move($path, $filename); // 修正原insert写法错误,需传入键值对数组 DB::table('books')->insert([ 'images' => $filename, // 补充你的其他字段对应值 ]); return redirect('home')->with('status', 'insert succesfully'); } else { dd('Request Hash No File!'); }
- 修改前端视图图片访问路径:
@foreach ($booksDTL as $deTailsB) <div class="col-md-4"> <!-- 路径调整为storage下的映射路径 --> <img src="{{ asset('storage/Uploads/'.$deTailsB->images) }}" width="100%" height="100%" title="{{ $deTailsB->images }}"/> </div> <div class="col-md-6"> <H1>{{ ucfirst(trans($deTailsB->name)) }}</H1> <p>{{ strtoupper($deTailsB->author) }}</p> </div> @endforeach
方案2:手动为根目录Uploads创建软链接
如果你不想修改现有上传逻辑,可以手动创建软链接将根目录Uploads映射到public目录下:
- Linux/Mac 终端执行:
ln -s /你的项目完整根路径/Uploads /你的项目完整根路径/public/Uploads - Windows 管理员身份运行CMD执行:
mklink /d 你的项目完整根路径\public\Uploads 你的项目完整根路径\Uploads
配置完成后无需修改原有前端代码,即可正常访问图片。
额外注意事项
原有代码中DB::table('books')->insert($filename);写法不符合Laravel查询构造器规范,insert方法需要传入键值对数组,否则会触发SQL语法错误,建议同步修正该部分逻辑。
内容的提问来源于stack exchange,提问作者Shabrina Nurdiani S
相关产品推荐
相关产品推荐

