【问题标题】:Laravel Validator only works for failsLaravel 验证器仅适用于失败
【发布时间】:2020-03-16 22:08:36
【问题描述】:

我正在尝试在 laravel 中验证上传文件。

该文件只接受xlsx,xls and csv

我的控制器有这个工作代码

  public function project_import_excel(Request $request){
    $validator = Validator::make($request->all(), [
        'file' => 'required|max:5000|mimes:xlsx,xls,csv'
    ]);

    $modal = "active";

    if($validator->passes()){
        return redirect()
        ->back()
        ->with(['success'=>'File uploaded successfully!'])
        ->with('modal',$modal);
    }else{
        return redirect()
        ->back()
        ->with(['errors'=>$validator->errors()->all()])
        ->with('modal',$modal);
    }
}

我的blade 文件中有errors and success 的此会话

 @if(session('errors'))
   <div class="alert alert-danger" role="alert">  
        @foreach($errors as $error)
           <li>{{$error}}</li>
        @endforeach
    </div>
    <hr>

 @elseif(session('success'))

    <div class="alert alert-success" role="alert"> 
       {{ session('success') }}
    </div>
    <hr>

 @endif

如果我尝试上传.jpeg 或任何其他不是xlsx, xls, or csv 的文件

这会给我一个类似的消息

但是如果我上传一个像`

不想显示成功消息。我的if else 有什么问题吗?

问题是,它总是以session('errors')结束

更新 我试图删除这个mimes:xlsx,xls,csv 并且session('success') 工作正常。但是如何验证哪些文件是可接受的?

我的HTML 代码form

   <div class="modal fade" id="bulkProjMod" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
   <div class="modal-dialog" role="document">
    <div class="modal-content">
    <!--Header-->
     <div class="modal-header">
    <h4 class="modal-title" id="myModalLabel">Upload Projects List</h4>
    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
      <span aria-hidden="true">×</span>
      </button>
     </div>
     <!--Body-->
     <div class="modal-body">
      <div class="container">

        @include('main.projectlistRedirectBack')

        <p class="note note-success">
            <strong>Note upload:</strong> 
            You are trying to upload multiple project records that containas multiple task records. This record will be useful to any transaction
            <br>
            *format : <b><em>xlsx,xls,csv</em></b><br>
            </p>

            <form action="{{ url('/projectlist/project_import_excel') }}" method="POST" enctype="multipart/form-data">

            {{ csrf_field() }}
            <div class="file-field">
                <div class="btn-sm float-left">
                    <span>Choose file</span>
                    <input type="file" name="file" id="file">
                </div>
            </div>
    </div>


    </div>
    <!--Footer-->
    <div class="modal-footer">
    <button type="button" class="btn btn-outline-success" data-dismiss="modal">Close</button>
    <button type="submit" name="submitImport" class="btn btn-success waves-effect" id="upBulkSubmit">Upload</button>
        </form>
     </div>
   </div>
  </div>
  </div>

试过这个dd($validator);

【问题讨论】:

  • 尝试状态:redirect()-&gt;back()-&gt;with('status', 'File uploaded successfully!')-&gt;with('modal',$modal);。然后在刀片@if (session('status')) &lt;div class="alert alert-success"&gt; {{ session('status') }} &lt;/div&gt; @endif
  • 我也尝试将变量 success 更改为 status 但仍然相同
  • 您的表单上有 enctype="multipart/form-data" 吗?
  • 是的,我的表单上有这个属性enctype="multipart/form-data"
  • 上传excel文件时能否ddrequest$validator查看文件是否存在?

标签: php laravel


【解决方案1】:

@porloscerros 提供的链接

Laravel validator and excel files error

这个答案,解决了我的问题!

   $validator = Validator::make(
    [
        'file'      => $request->file,
        'extension' => strtolower($request->file->getClientOriginalExtension()),
    ],
    [
        'file'          => 'required|max:5000',
        'extension'      => 'required|in:,csv,xlsx,xls',
    ]
    );

【讨论】:

    【解决方案2】:

    尝试以下方法:

    @elseif(Session::has('success'))
    <div class="alert alert-success" role="alert">
      {{ Session::get('success')}}
    </div>
    @endif
    
    

     @else(session('success'))
    
        <div class="alert alert-success" role="alert"> 
           {{ $success }}
        </div>
        <hr>
    
     @endif
    
    
    

    【讨论】:

    • 尝试了您的选择,但仍然遇到同样的错误。
    【解决方案3】:

    试试这个

    if ($validator->fails()) {
    return redirect()->back()
        ->withErrors($validator)
        ->with([
            'modal' => $modal
        ]);
    } else {
    return redirect()->back()
        ->with([
            'success'=>'File uploaded successfully!'
            'modal' => $modal
        ]);
    }
    

    @if ($errors->any())
    <div class="alert alert-danger" role="alert">  
        @foreach ($errors->all() as $error)
           <li>{{$error}}</li>
        @endforeach
    </div>
    <hr>
    @else
    <div class="alert alert-success" role="alert"> 
       {{ session('success') }}
    </div>
    <hr>
    @endif
    

    希望能成功

    【讨论】:

    • 还是一样。
    【解决方案4】:

    您可以尝试显示成功和错误消息以分隔条件:

    if($validator->passes()){
        return redirect()
        ->back()
        ->with('success', 'File uploaded successfully!')
        ->with('modal',$modal);
    }else{
        return redirect()
        ->back()
        ->with(['errors'=>$validator->errors()->all()])
        ->with('modal',$modal);
    }
    

    然后查看文件:

    @if(Session::has('success'))
         <div class="alert alert-success" role="alert"> 
             {{ Session::get('success') }}
         </div>
    @endif
    
    
    @if(session('errors'))
        <div class="alert alert-danger" role="alert">  
           @foreach($errors as $error)
               <li>{{$error}}</li>
           @endforeach
        </div>
    @endif
    

    【讨论】:

      猜你喜欢
      • 2020-09-24
      • 2014-10-23
      • 1970-01-01
      • 2019-11-25
      • 2019-02-23
      • 2021-10-06
      • 2014-08-16
      相关资源
      最近更新 更多