如何使用 laravel 同时上传图片和视频

how to upload both image and video at the same time with laravel

我正在尝试同时上传图片和视频,但不能

我试过了,但是好像不行,图片文件可以上传成功,但是视频上传不了

$request->validate([
        'title'=> 'required',
        'description' => 'required',
        'file' => 'required|mimes:jpg,jpeg,png|max:2048',
        'video' => 'required|mimes:mp4'
    ]);

    $film= Film::create([
        'title' => $request->title,
        'slug' => Str::slug($request->title),
        'description' => $request->description,
        'user_id' => auth()->id()
    ]);

    $file = new Film();

    if($request->file('file')) {
            $file_name = time().'_'.$request->file->getClientOriginalName();
            $file_path = $request->file('file')->storeAs('uploads', $file_name, 'public');

            $file->name = time().'_'.$request->file->getClientOriginalName();
            $file->file = '/storage/' . $file_path;
            $film->update(['file' => $file_name]);
            $film->update(['path' => $file_path]);

            return response()->json(['success'=>'File uploaded successfully.']);
    }
    if ($request->file('video')){
            $file_name = time().'_'.$request->file->getClientOriginalName();
            $file_path = $request->file('video')->storeAs('uploads', $file_name, 'public');

            $file->name = time().'_'.$request->file->getClientOriginalName();
            $file->file = '/storage/' . $file_path;
            $film->update(['video' => $file_name]);
            $film->update(['videoPath' => $file_path]);

            return response()->json(['success'=>'File uploaded successfully.']);
        }

这是因为您在处理图片文件后return进行响应,因此无法达到视频的条件。如果你想在所有操作完成后 return 处理两者。

$request->validate([
    'title'=> 'required',
    'description' => 'required',
    'file' => 'required|mimes:jpg,jpeg,png|max:2048',
    'video' => 'required|mimes:mp4'
]);

$film= Film::create([
    'title' => $request->title,
    'slug' => Str::slug($request->title),
    'description' => $request->description,
    'user_id' => auth()->id()
]);

if($request->file('file')) {
    $file_name = time().'_'.$request->file->getClientOriginalName();
    $file_path = $request->file('file')->storeAs('uploads', $file_name, 'public');

    $film->update([
        'file' => $file_name,
        'path' => $file_path
    ]);
}

if ($request->file('video')){
    $file_name = time().'_'.$request->video->getClientOriginalName();
    $file_path = $request->file('video')->storeAs('uploads', $file_name, 'public');

    $film->update([
        'video' => $file_name,
        'videoPath' => $file_path
    ]);
}

return response()->json(['success'=>'Files uploaded successfully.']);

如果成功处理了每个条件中的文件,您还可以添加额外的检查。

$file 变量是不必要的,它甚至没有保存,所以也可以删除。

至于上传两次的原因,你又在video条件下调用了->file,应该是->video.

另外,您可以通过传递多个数组项来一次更新多个字段,而不是为每个 属性 调用更新,这可以节省您的数据库请求。

jech chua,谢谢,它成功了,但它上传了两次图像。

可能我的blade

有问题
<form action="/film" class="form" method="POST" enctype="multipart/form-data">
        @csrf
        <div class="f">
            <div class="sect1">
                <input type="text" class="input" name="title" placeholder="Title..">
                <textarea name="description" class="textarea" placeholder="Description.."></textarea>
                <h2>Upload image</h2><input type="file" name="file" class="file">
            </div>
            <div class="dropz" id="image-upload">
                <h2>Upload video</h2>
                <input type="file" name="video">
            </div>
        </div>
        <button type="submit" class="buttn">Create film</button>
    </form>