首页 > 社区问答列表 >如何在 Laravel 中防止子文件夹中的重复文件

  如何在 Laravel 中防止子文件夹中的重复文件

我创建了一个添加视图,可以同时上传多个文件。当文件被上传时,文件路径会显示为类似于 'Drawings/PartNumber/Type/filename.extension' 的格式。我想要在 'Drawings' 文件夹中检查,确保任何文件都不能与扩展名相同。请问如何实现?

  1. Drawings/PartNumber1/Type1/filename1.pdf
  2. Drawings/PartNumber2/Type2/filename1.pdf
  3. Drawings/PartNumber1/Type3/filename1.pdf
  4. Drawings/PartNumber1/filename1.pdf
  5. Drawings/filename1.pdf never will be accepted.

我的函数是:

public function AddNewPart(Request $request)
    {
if (array_key_exists('DrawingFile',$data)) {
                foreach($request->file('DrawingFile') as $key=>$file)
                {
                    if ($data['fileupload_ID'][$key]==NULL) {
                        $extension=$file->getClientOriginalExtension();
                        $file_name2 = $file->getClientOriginalName();
                        $filepath='Drawings/'.$data['PartNumber'].'/'.$data['Type'][$key].'/'.$file_name2;
                        $file->move(public_path('Drawings/'.$data['PartNumber'].'/'.$data['Type'][$key].'/'), $file_name2);
                        $DocumentData2=array('Type'=>$data['Type'][$key],'fcontent'=>$file_name2,'condpartno'=>$data['PartNumber'],'fname'=>$filepath,
                        'DrawingNo'=>$data['DrawingNo'][$key],'DocumentType'=>$data['Type'][$key]);
                        DB::table('fileupload')->insert($DocumentData2);
                    }
                }
            }
    }


P粉770375450
P粉770375450

  • P粉154228483
  • P粉154228483   采纳为最佳   2023-08-01 00:11:46 1楼

    如果您希望防止相同的文件在不同的子目录中被多次上传,您可以利用 Laravel 的文件系统(Filesystem)并在尝试上传文件之前检查文件是否存在。

    文件门面(File facade)提供了一个 exists 方法,您可以使用它来检查给定路径中的文件是否存在。

    下面是您可能会修改的方法:


    use Illuminate\Support\Facades\File;
    
    public function AddNewPart(Request $request)
    {
        if (array_key_exists('DrawingFile',$request->all())) {
            foreach($request->file('DrawingFile') as $key=>$file)
            {
                if ($request->fileupload_ID[$key] == NULL) {
                    $extension = $file->getClientOriginalExtension();
                    $file_name2 = $file->getClientOriginalName();
                    $filepath = 'Drawings/'.$request->PartNumber.'/'.$request->Type[$key].'/'.$file_name2;
    
                    // Check if the file already exists before moving it
                    if (!File::exists(public_path($filepath))) {
                        $file->move(public_path('Drawings/'.$request->PartNumber.'/'.$request->Type[$key].'/'), $file_name2);
    
                        $DocumentData2 = array(
                            'Type'=>$request->Type[$key],
                            'fcontent'=>$file_name2,
                            'condpartno'=>$request->PartNumber,
                            'fname'=>$filepath,
                            'DrawingNo'=>$request->DrawingNo[$key],
                            'DocumentType'=>$request->Type[$key]
                        );
    
                        DB::table('fileupload')->insert($DocumentData2);
                    } else {
                        // You might want to return some feedback to the user here
                        return response()->json([
                            'error' => 'File already exists.'
                        ], 400);
                    }
                }
            }
        }
    }
    

    上述代码只会在指定目录中不存在该文件时才进行上传。如果文件已经存在,则会返回一个带有消息 '文件已存在' 的错误响应。

    需要注意的一点是 getClientOriginalName() 方法的行为。它将返回来自客户端机器的文件的原始名称,如果来自不同客户端的文件具有相同的名称,可能会导致问题。如果这是一个问题,请考虑在上传时实施唯一命名约定。

    此外,请记住在文件的顶部导入必要的类,并注意处理所有潜在问题,如缺少必填字段或数据库插入失败。


    +0 添加回复