Laravel 6图片上传至文件夹及数据库报错:临时文件不存在或不可读
看起来你遇到的问题是图片能成功上传到指定文件夹,但数据库没写入数据,还出现了临时文件不可读的报错。我帮你分析下原因,然后给出具体的修复方案:
1. 修复临时文件不可读的报错
你的代码里第一个图片处理逻辑中,先获取了$file = $req->file('anhbia');,但后续却用$req->file('anhbia')->move(...)执行移动操作——这属于重复操作同一个文件实例,容易导致临时文件引用异常。更稳妥的方式是直接用已经赋值的$file变量调用move():
// 原代码 $req->file('anhbia')->move('sources/image', $name); // 修改后 $file->move('sources/image', $name);
把所有图片处理块里的$req->file()->move()都替换成$file->move(),就能解决临时文件找不到的问题。
2. 解决数据库不写入的问题
数据库没写入主要有两个核心原因:
a. 模型未设置批量赋值白名单
检查你的chitiet模型,必须确保$fillable属性包含所有需要赋值的字段,否则Laravel的批量赋值保护会阻止字段写入数据库:
class chitiet extends Model { protected $fillable = [ 'tengame', 'idnhaphathanh', 'idtheloai', 'idcauhinh', 'namphathanh', 'mota', 'nentang', 'link', 'link2', 'anhbia', 'anh1', 'anh2', 'anh3', 'video', 'luottai' ]; }
b. echo 'failese';破坏了响应流程
当某个图片未上传时,你用echo 'failese';直接输出内容,这会导致Laravel的HTTP响应提前发送,后续的$chitiet->save()代码根本不会执行。直接删掉所有echo 'failese';即可——如果图片是可选上传的,跳过赋值逻辑不影响后续保存操作。
3. 优化验证逻辑(可选但推荐)
你当前的validate方法是空的,建议添加文件验证规则,提前拦截不符合要求的文件,让代码更健壮:
$this->validate($req, [ 'tengame' => 'required|string', 'namphathanh' => 'required|integer|between:2000,2019', 'anhbia' => 'nullable|image|mimes:jpg', 'anh1' => 'nullable|image|mimes:jpg', 'anh2' => 'nullable|image|mimes:jpg', 'anh3' => 'nullable|image|mimes:jpg', ], [ 'tengame.required' => 'Tên game không được để trống', 'namphathanh.between' => 'Năm phát hành phải từ 2000 đến 2019', 'anhbia.mimes' => 'Chỉ được thêm ảnh có đuôi jpg nhé', 'anh1.mimes' => 'Chỉ được thêm ảnh có đuôi jpg nhé', 'anh2.mimes' => 'Chỉ được thêm ảnh có đuôi jpg nhé', 'anh3.mimes' => 'Chỉ được thêm ảnh có đuôi jpg nhé', ]);
这样就不用在每个文件处理块里手动判断扩展名了,代码更简洁易维护。
修复后的完整Controller代码
public function postThem(Request $req) { $this->validate($req, [ 'tengame' => 'required|string', 'namphathanh' => 'required|integer|between:2000,2019', 'anhbia' => 'nullable|image|mimes:jpg', 'anh1' => 'nullable|image|mimes:jpg', 'anh2' => 'nullable|image|mimes:jpg', 'anh3' => 'nullable|image|mimes:jpg', ], [ 'tengame.required' => 'Tên game không được để trống', 'namphathanh.between' => 'Năm phát hành phải từ 2000 đến 2019', 'anhbia.mimes' => 'Chỉ được thêm ảnh có đuôi jpg nhé', 'anh1.mimes' => 'Chỉ được thêm ảnh có đuôi jpg nhé', 'anh2.mimes' => 'Chỉ được thêm ảnh có đuôi jpg nhé', 'anh3.mimes' => 'Chỉ được thêm ảnh có đuôi jpg nhé', ]); $chitiet = new chitiet(); $chitiet->tengame = $req->tengame; $chitiet->idnhaphathanh = $req->idnhaphathanh; $chitiet->idtheloai = $req->idtheloai; $chitiet->idcauhinh = $req->idcauhinh; $chitiet->namphathanh = $req->namphathanh; $chitiet->mota = $req->mota; $chitiet->nentang = $req->nentang; $chitiet->link = $req->link; $chitiet->link2 = $req->link2; if($req->hasFile('anhbia')) { $file = $req->file('anhbia'); $name = $req->tengame . ".jpg"; $file->move('sources/image', $name); $chitiet->anhbia = $name; } if($req->hasFile('anh1')) { $file = $req->file('anh1'); $name = $req->tengame . "1.jpg"; $file->move("sources/image", $name); $chitiet->anh1 = $name; } if($req->hasFile('anh2')) { $file = $req->file('anh2'); $name = $req->tengame . "2.jpg"; $file->move("sources/image", $name); $chitiet->anh2 = $name; } if($req->hasFile('anh3')) { $file = $req->file('anh3'); $name = $req->tengame . "3.jpg"; $file->move("sources/image", $name); $chitiet->anh3 = $name; } $chitiet->video = $req->video; $chitiet->luottai = "0"; $chitiet->save(); return redirect()->back()->with('ok','Thêm game thành công :v'); }
内容的提问来源于stack exchange,提问作者Modric
相关产品推荐
相关产品推荐

