Laravel创建页上传图片存为tmp临时路径 需按视频ID命名如何解决
Laravel上传图片随视频ID命名及临时路径问题解决
核心问题原因
- 代码执行顺序错误:你当前先处理图片存储命名,再创建视频数据,此时视频还未写入数据库,没有生成对应的ID,你调用的
$art_video->id是上传文件实例的属性,不是数据库生成的视频ID,完全无效 - 临时路径写入逻辑漏洞:当图片处理分支未触发、或者未上传视频文件时,
$data['image_path']仍然保留请求上传时的临时文件路径,直接写入数据库就会出现/tmp/phpXXX的格式
解决逻辑
调整执行顺序,先创建视频基础数据拿到自增ID,再处理图片、视频的存储,用生成的视频ID命名图片,最后更新视频记录的对应路径字段。
修改后的控制器代码
public function store(Request $request) { $data = $request->validate([ 'video_path' => 'nullable|mimes:mp4,avi,mpeg,ogx,oga,ogv,ogg,webm|max:25600', 'user_id' => 'required|integer', 'category_id' => 'required|integer', 'video_section_id' => 'required|string', 'title' => 'required|string', 'post_date' => 'nullable|date', 'description' => 'nullable|string', 'youtube_link' => 'nullable|string', 'image_path' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2140', ]); if ($request->check_type == 1) { $data['type'] = 'link'; } $data['post_date'] = $request->post_date ?? date('Y-m-d'); // 先临时移除文件字段,先创建基础数据拿ID $tempVideoPath = $data['video_path'] ?? null; $tempImagePath = $data['image_path'] ?? null; unset($data['video_path'], $data['image_path']); // 先创建视频记录拿到ID $created_id = Video::create($data); $videoId = $created_id->id; if ($request->hasFile('video_path')) { $art_video = $request->file('video_path'); $ad_video_name = uniqid('video_') . Str::random(10) . '.' . $art_video->getClientOriginalExtension(); // 处理视频存储 if ($art_video->isValid()) { $foldername = '/video'; $video_path = $art_video->storeAs($foldername, $ad_video_name, 'public'); $data['youtube_link'] = null; $data['type'] = 'directly'; $data['video_path'] = 'public/' . $video_path; } // 处理图片存储,用已经生成的视频ID命名 if ($request->hasFile('image_path')) { $video_image_path = $request->file('image_path'); if ($video_image_path->isValid()) { $imgExt = $video_image_path->getClientOriginalExtension(); $video_image_name = $videoId . '.' . $imgExt; $video_image_path_resize = Image::make($video_image_path->getRealPath())->resize(400, 200); $video_image_path_resize->save(public_path('video/themnull/' . $video_image_name)); $data['image_path'] = 'public/video/themnull/' . $video_image_name; } } // 更新视频记录的路径字段 $created_id->update($data); } if ($request->filled('tag_name')) { foreach ($request->tag_name as $tag_name) { VideoTag::create([ 'video_id' => $videoId, 'tag_name' => $tag_name ]); } } try { $this->successfullymessage('Video Added successfully '); return redirect()->back(); } catch (\Exception $e) { $this->failmessage($e->getMessage()); return redirect()->back(); } }
关键修改说明
- 先把文件字段从入库数据中移除,先创建视频基础数据,拿到数据库生成的自增视频ID
- 视频存储处理完成后,再处理图片,用已经拿到的视频ID作为图片名称
- 所有文件处理完成后,再统一更新视频记录的路径字段,避免临时路径写入数据库
- 移除了无效的
$art_video->id调用,替换为实际生成的视频ID
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

