如何在Laravel的public目录上传图片?解决路径显示异常问题
解决Laravel图片上传存绝对路径导致asset()生成错误URL的问题
问题核心是move()方法返回的是本地绝对路径,直接存入数据库后,asset()会把这个绝对路径拼接到站点URL后,生成无效的访问链接。
直接修改代码方案
只需要存入相对于public目录的相对路径,即可让asset()生成正确URL:
if ($request->hasFile('images')) { $uploaded_images = $request->file('images'); foreach ($uploaded_images as $upload_image) { $image_hash_name = uniqid().'.'.$upload_image->getClientOriginalExtension(); // 执行文件移动,无需用返回值存储路径 $upload_image->move(public_path('images/product'), $image_hash_name); $image = new Image; // 存入相对public目录的路径,而非绝对路径 $image->image = 'images/product/' . $image_hash_name; $image->product_id = $new_product_id->id; $image->save(); } return redirect()->route('admin.products.index'); }
修改后,使用asset($image->image)会生成正确的访问链接,例如:http://127.0.0.1:8000/images/product/64b14097befca.png。
更符合Laravel最佳实践的方案
使用Storage门面处理上传,默认会返回相对路径:
// 确保config/filesystems.php中public磁盘的root指向public_path() if ($request->hasFile('images')) { $uploaded_images = $request->file('images'); foreach ($uploaded_images as $upload_image) { $image_hash_name = uniqid().'.'.$upload_image->getClientOriginalExtension(); // storeAs返回相对于public目录的路径 $path = $upload_image->storeAs('images/product', $image_hash_name, 'public'); $image = new Image; $image->image = $path; $image->product_id = $new_product_id->id; $image->save(); } return redirect()->route('admin.products.index'); }
后续用asset($image->image)或Storage::url($image->image)均可生成有效链接。
内容的提问来源于stack exchange,提问作者Irakli Qiria
相关产品推荐
相关产品推荐

