You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:24:03