Я создаю медиа-библиотеку, используя laravel и dropzone. При перетаскивании папки в браузер она отправляет на сервер несколько запросов.
Но второй запрос всегда выдает исключение «mkdir (): файл существует». (Нет проблем для первого запроса и после второго запроса)
Например:
Request 1:
fullPath: test folder/1.jpg
folder_id: 1
file: (binary)
Request 2:
fullPath: test folder/2.jpg
folder_id: 1
file: (binary)
Request 3:
fullPath: test folder/3.jpg
folder_id: 1
file: (binary)
Request 4:
fullPath: test folder/4.jpg
folder_id: 1
file: (binary)
Сервер сохранил файлы для запроса 1, 3, 4. И потерял файл для запроса 2.
Я попытался проверить, существует ли папка, с помощью Storage :: exist () и задержки между каждым запросом в Dropzone, но все не работает.
Мой код здесь:
// MediaController.php
public function upload(Request $request){
$input_data = $request->all();
$file = $input_data['file'];
Media::saveMedia($input_data, $file)
}
// Media.php
public static function saveMedia($data, $file){
$media = new Media;
$media->folder_id = isset($data['folder_id']) ? $data['folder_id'] : 0;
$media->file_name = $file->getClientOriginalName();
$mediaFolder = MediaFolder::create($media->folder_id, $folder_path); // $folder_path is "test folder"
$media->folder_id = $mediaFolder->id;
$media->save();
// ...
}
// MediaFolder.php
public static function create($parent_folder_id = 0, $folder_name){
$is_exists_folder = MediaFolder::where(['parent_id' => $parent_folder_id, 'name' => $folder_name])->first();
if(!$is_exists_folder){ // <-- expected false on Request 2 because Request 1 should be already saved to database, but actually true
$parentFolder = MediaFolder::find($parent_folder_id);
if(!$parentFolder){
$parentFolder = new MediaFolder;
$parentFolder->id = 0;
}
$new_folder_path = $parentFolder->getPath() . '/' . $folder_name;
if(!Storage::exists($new_folder_path)){
Storage::makeDirectory($new_folder_path); // <-- throws "mkdir(): File exists" exception on Request 2
}
$mediaFolder = new MediaFolder;
$mediaFolder->name = $folder_name;
$mediaFolder->parent_id = $parent_folder_id;
$mediaFolder->save();
}else{
$mediaFolder = $is_exists_folder;
}
return $mediaFolder;
}