通过Dropzone多个上传文件后,Storage :: makeDirectory()收到“ mkdir():文件存在”消息

时间:2019-05-08 04:55:08

标签: php laravel php-7 dropzone.js mkdir

我正在使用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 :: exists()检查文件夹是否存在,并在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;

    }

0 个答案:

没有答案