Laravel+Vue+Laragon构建CRUD时图片存储路由错误求助
Laravel+Vue CRUD图片存储问题解决(Laragon环境)
问题定位
你的问题源于代码逻辑错误,和Laragon配置无关:
- 临时路径提前写入数据库:在处理图片存储前就调用
Concert::create($request->all()),此时request里的image字段是PHP临时文件路径,直接被存入数据库。 - 文件存储路径错误:
storeAs的目录参数写错,导致文件存到符号链接无法访问的位置,触发“path cannot be empty”错误。 - 更新时删除文件路径不匹配:删除旧图片时使用了带前置斜杠的路径,不符合Laravel Storage的路径规则。
修复步骤
1. 修正Store方法
先处理图片存储,再创建Concert记录,避免临时路径存入数据库:
public function store(Request $request) { $request->validate([ 'name' => 'required|max:30', 'description' => 'required|max:200', 'date' => 'required|date', 'duration' => 'required|date_format:H:i:s', 'image' => 'required|file|mimes:png,jpg,gif', 'artists' => 'required|array' ]); // 提取除image外的字段,避免临时路径写入数据库 $concertData = $request->except('image'); $concert = Concert::create($concertData); if ($request->hasFile('image')) { $imgName = microtime(true) . '.' . $request->file('image')->getClientOriginalExtension(); // public磁盘根目录对应storage/app/public,直接写img即可 $request->file('image')->storeAs('img', $imgName, 'public'); // 符号链接指向storage/app/public,所以访问路径要带storage前缀 $concert->image = '/storage/img/' . $imgName; $concert->save(); } $concert->artists()->sync($request->artists); return redirect('concerts/create')->with('success', 'Concert created'); }
2. 修正UpdateConcert方法
调整图片处理逻辑,修复删除文件的路径问题:
public function updateConcert(Request $request, Concert $concert) { $request->validate([ 'name' => 'required|max:30', 'description' => 'required|max:200', 'date' => 'required|date', 'duration' => 'required|date_format:H:i:s', 'id' => 'required|numeric', ]); // 提取除image外的字段更新 $concertData = $request->except('image'); $concert->update($concertData); if ($request->hasFile('image')) { // 去掉路径开头的斜杠,匹配Storage的相对路径规则 if ($concert->image) { $oldImagePath = ltrim($concert->image, '/'); Storage::disk('public')->delete($oldImagePath); } $imgName = microtime(true) . '.' . $request->file('image')->getClientOriginalExtension(); $request->file('image')->storeAs('img', $imgName, 'public'); $concert->image = '/storage/img/' . $imgName; $concert->save(); } $concert->artists()->sync($request->artists); return redirect('concerts')->with('success', 'Concert updated'); }
3. 验证符号链接
确保已正确创建符号链接,在项目根目录执行:
php artisan storage:link
执行后public/storage会链接到storage/app/public,/storage/img/xxx就能正确访问到对应文件。
关键说明
- 永远不要在处理上传文件前,将整个
request数据写入数据库,避免临时路径留存。 - 使用
public磁盘时,storeAs的第一个参数是相对于storage/app/public的目录,无需加public/前缀。 - 前端访问图片的路径必须以
/storage/开头,匹配符号链接的URL映射规则。
内容的提问来源于stack exchange,提问作者user28219093
相关产品推荐
相关产品推荐

