Laravel 分别验证每个文件

Posted

技术标签:

【中文标题】Laravel 分别验证每个文件【英文标题】:Laravel validate each file separately 【发布时间】:2021-10-11 06:40:02 【问题描述】:

我想验证多个文件的大小,如果大小不合适,我想调整单个文件的大小,如果大小合适,我以原始大小上传。

我在前面有几个输入:

<div class="form-group">
     <strong>SELECT MAIN IMAGE (required)</strong>
     <input type="file" name="files[fileMain]" id="fileMain" class="form-control-file border 
      mb-1  $errors->has('fileMain') ? ' is-invalid' : '' " >
</div>

<div class="form-group">
     <input type="file" name="files[]" id="file1" class="form-control-file border mb-1 
     $errors->has('file') ? ' is-invalid' : '' " >
</div>

在我的控制器中: 我用:

foreach($request->file('files') as $index => $file) 
   // Laravel validators methods works only for arrays so new Request array is created here
   $single_file_array = new Request(
    [
       'files[]' => $file
    ]);
    // send single file to validator
    $imageSizeValidation = ImageUtil::imageSizeValidator($single_file_array, 
    ENUMS::MAX_IMAGE_RESOLUTION_FOR_PROVIDER);

    if($imageSizeValidation) 
       $new_name = ImageUtil::uploadOriginalImageFileToBlogFolder2($file, $dest_folder);
     else 
        // resize image and save to dB
        $new_name = ImageUtil::resizeImage2($file, ENUMS::MAX_IMAGE_RESOLUTION_FOR_PROVIDER, 
        $dest_folder);
    

我的验证器看起来像:

$sizeValidator = Validator::make($request->all(),
   [
      'files.*' => Rule::dimensions()->maxWidth($predefined_max_size)
   ]);

   if($sizeValidator->fails()) 
      return false;
   
   
   return true;

所有文件都是真实的 :( 这意味着验证器看不到文件并且不验证它们。 这段代码有什么问题? 如何验证单个文件,然后决定如果单个文件失败该怎么办 我不想一次发送所有文件,因为它不会让我决定单个文件。

【问题讨论】:

【参考方案1】:

好吧,我想出如下解决方案。 我获取每个文件(来自 $request->files() 并提出一个包含该文件的新请求(UploadedFile 的新实例)并验证该新请求。 我认为这是真正解决方案的更多解决方法,但没有人提出更好的方法。 我的代码:

foreach($request->file('files') as $index => $file) 
   $single_file_request = new Request();

   $uploadedFileAddress = $file->getPathname();
   $new_file = new UploadedFile($uploadedFileAddress, "files[$index]"); 
   $single_file_request->files->set("files", ['files' => $new_file]); 

   $imageSizeValidation = ImageUtil::imageSizeValidator($single_file_request, ENUMS::MAX_IMAGE_RESOLUTION_FOR_PROVIDER);

// rest of the code 

它并不完美,但可以完成工作。 现在在验证每个文件之后,我可以决定如何处理它:) 也许这会激发某人找出其他/更好的解决方案:)

【讨论】:

以上是关于Laravel 分别验证每个文件的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.4 中两种不同的身份验证模型

如何在 Vue 2 和 Laravel 5.5 中验证会话和身份验证令牌

如何验证 Laravel 中的每个数组索引

Laravel中表单验证里unique在update时怎么排除当前记录

Laravel - 视频文件验证

在 laravel 的 AppServiceProvider 中使用身份验证