как загрузить изображение и видео одновременно с помощью laravel

#laravel #laravel-blade

Вопрос:

я пытаюсь загрузить изображение и видео одновременно, но не смог

я пробовал это, но, похоже, это не работает, файл изображения будет успешно загружен, но видео не будет

 $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.']);
        }
 

Ответ №1:

Это потому, что вы возвращаете ответ после обработки файла изображения, поэтому условие для видео не может быть достигнуто. Если вы хотите обработать и то, и другое, просто вернитесь после выполнения всех операций.

 $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 Переменная не нужна, и она даже не сохранена, поэтому ее также можно удалить.

Что касается причины, по которой он загружается дважды, вы ->file снова вызываете внутри video условия, которое должно быть ->video .

И, кроме того, вы можете обновить несколько полей одновременно, передав несколько элементов массива вместо вызова обновления для каждого свойства, что может сэкономить ваши запросы к БД.

Комментарии:

1. Обновил свой ответ.

Ответ №2:

джек чуа, спасибо, что сработало, но изображение загружается дважды.

может быть, у меня проблема с клинком

 <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>