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