Laravel 5.6图片存储问题咨询:路径与数据库记录异常
嘿,这俩问题都是Laravel文件上传里的典型坑,我来帮你逐个拆解解决~
问题1:site_logo字段存储的是临时路径/tmp/phpqTLyXY,而非生成的$new_name
原因
你大概率是直接获取了PHP上传文件的临时路径,没有实际将文件移动到Laravel的storage目录中。PHP在处理文件上传时,会先把文件放到系统临时目录(比如/tmp),请求结束后这个临时文件就会被自动删除,所以数据库存的只是临时文件的路径,而不是你想要的最终文件名。
解决方法
用Laravel提供的文件存储方法(比如storeAs)来处理上传,确保文件被移动到指定目录,再把正确的路径存入数据库。举个正确的控制器代码示例:
public function updateLogo(Request $request) { // 验证上传的文件(可选但推荐) $request->validate([ 'logo' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048', ]); $new_name = time() . '-logo.png'; // 将文件存储到storage/app/public目录下(这个目录可以通过符号链接被web访问) $path = $request->file('logo')->storeAs('public', $new_name); // 把public/前缀去掉,只存文件名到数据库,方便后续生成访问URL $storagePath = str_replace('public/', '', $path); Setting::update(['site_logo' => $storagePath]); return redirect()->back()->with('success', 'Logo更新成功'); }
这样site_logo字段就会存储你生成的1518975452-logo.png,而不是临时路径了。
问题2:访问project.app/storage/1518975452-logo.png提示页面不存在
原因
Laravel的storage目录默认不在web服务器的根目录(public目录)下,直接访问project.app/storage/...是找不到文件的。要让storage里的文件能被web访问,需要通过符号链接把storage/app/public目录映射到public/storage目录。
解决方法
- 创建符号链接:在项目根目录下执行Artisan命令:
php artisan storage:link
这个命令会在public目录下生成一个storage符号链接,指向storage/app/public目录。
确认文件存储位置:确保你上传的文件是存在
storage/app/public目录下的(就像上面代码里用storeAs('public', $new_name)那样),这样文件会被放到storage/app/public/1518975452-logo.png,通过符号链接就能用project.app/storage/1518975452-logo.png访问到。生成正确的访问URL(推荐):在视图里可以用Laravel的
Storage门面生成安全的访问URL,比如:
// 从数据库取出site_logo的值,比如1518975452-logo.png $logoUrl = Storage::url($setting->site_logo); // 输出的就是/storage/1518975452-logo.png,直接用在img标签里就行 echo '<img src="' . $logoUrl . '" alt="Site Logo">';
这样就能确保图片路径正确可访问啦~
内容的提问来源于stack exchange,提问作者user9334443

