【问题标题】:Laravel validation not working with array of filesLaravel 验证不适用于文件数组
【发布时间】:2016-05-02 19:09:38
【问题描述】:

我正在向 Laravel 提交一组文件字段,我想对每个文件运行验证以检查它是否是正确的 mime 类型(应该只允许 PNG、JPG 和 GIF)但是如果我上传 TIF 图像文件验证通过。这是我提交的内容:

Request URL:http://local.website.com/upload
Request Method:POST
Status Code:200 OK
Remote Address:127.0.0.1:80
Response Headers
view source
Connection:Keep-Alive
Content-Length:6
Content-Type:text/html; charset=UTF-8
Date:Mon, 02 May 2016 19:05:18 GMT
Keep-Alive:timeout=5, max=99
Server:Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.6.3
X-Powered-By:PHP/5.6.3
Request Headers
view source
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:19912006
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarypWGUvcecHBZlzNcP
Cookie:__utma=252126427.1839499577.1452033482.1452033483.1452072866.2; __utmz=252126427.1452033483.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _gat=1; _ga=GA1.2.1839499577.1452033482; laravel_session=eyJpdiI6InVxazdLSFwvNWNRUnl2eDQrRmFhdUpBPT0iLCJ2YWx1ZSI6IlJRXC9mRk9EYXBUWUpQMHpFMms3Mm9hYkRiekNjUlJHTDlBS0hpYkk2R091RmFYQzVsM1JWcEdMdmFzRjl3Q3BoaEZHQUM3VFc5ZE5Oak5KdHowaU0zdz09IiwibWFjIjoiZTYxM2U3MmVhNzU4NmFiZDNmYWFhNjdiZDE3NDczM2IxN2RmYWFhYWZlMzhiNTBiM2IwZjEyYWQwNThhMTk1MyJ9
Host:local.website.com
Origin:http://local.website.com
Pragma:no-cache
Referer:http://local.website.com/
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36
X-Requested-With:XMLHttpRequest
Request Payload
------WebKitFormBoundarypWGUvcecHBZlzNcP
Content-Disposition: form-data; name="files[]"; filename="eye design.png"
Content-Type: image/png


------WebKitFormBoundarypWGUvcecHBZlzNcP
Content-Disposition: form-data; name="files[]"; filename="hd flamingo.tif"
Content-Type: image/tiff


------WebKitFormBoundarypWGUvcecHBZlzNcP
Content-Disposition: form-data; name="files[]"; filename="Picture 3.tif"
Content-Type: image/tiff


------WebKitFormBoundarypWGUvcecHBZlzNcP
Content-Disposition: form-data; name="files[]"; filename="Picture 16.tif"
Content-Type: image/tiff


------WebKitFormBoundarypWGUvcecHBZlzNcP
Content-Disposition: form-data; name="files[]"; filename="Picture 23.tif"
Content-Type: image/tiff


------WebKitFormBoundarypWGUvcecHBZlzNcP--

这是我请求的内容:

<?php namespace App\Http\Requests;

use Response;
use Illuminate\Foundation\Http\FormRequest;

class UploadRequest extends FormRequest
{
    public function rules()
    {
        $rules = [
            'files' => 'required'
        ];
        foreach($this->files as $key => $file) {
            $rules['files.'.$key] = 'image|mimes:jpeg,png,gif';
        }
        return $rules;
    }

    public function messages()
    {
        $messages = [
            'files.required' => 'You must upload a file.'
        ];

        foreach($this->files as $key => $file) {
            $messages['files.'.$key.'.image'] = 'The upload file must be an image.';
            $messages['files.'.$key.'.mimes'] = 'The image must be one of the following types: JPEG, PNG, or GIF.';
        }
        return $messages;
    }

    public function authorize()
    {
        return true;
    }
}

这是我提交表单的路径:

Route::post('upload', ['uses' => 'UploadController@index', 'as' => 'upload.post']);

这是我的 UploadController 文件:

<?php namespace App\Http\Controllers;

use Response;
use Illuminate\Http\Request;
use Input;
use Image;
use Session;
use App\Http\Requests\UploadRequest;
use Auth;
use App\Setting;
use App\Discount;
use App\User_credit;
use App\Customer_group_discount;
use Event;
use App\Events\ImagesUpdated;

class UploadController extends Controller {

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {

    }

    /**
     * Handles the uploading of images
     *
     * @return Response json
     */
    public function index(UploadRequest $request)
    {
        // validation has passed do stuff
    }
}

请求肯定正在运行,但它并没有在应该执行的时候失败。我做错了什么?

【问题讨论】:

  • 首先,查看您的 routes.php 设置会有很大帮助,其次,您在此文件中的任何地方都没有使用 $this-&gt;validate($request, $rules);
  • 我添加了路由和控制器来显示验证是如何被调用的

标签: php laravel laravel-5.1


【解决方案1】:

我最终解决了,现在是我的请求:

<?php namespace App\Http\Requests;

use Response;
use Illuminate\Foundation\Http\FormRequest;

class UploadRequest extends FormRequest
{
    public function rules()
    {
        $request = $this->instance()->all();
        $images = $request['files'];

        $rules = [
            'files' => 'required'
        ];
        foreach($images as $key => $file) {
            $rules['files.'.$key] = 'image|mimes:jpeg,png,gif';
        }
        return $rules;
    }

    public function messages()
    {
        $request = $this->instance()->all();
        $images = $request['files'];

        $messages = [
            'files.required' => 'You must upload a file.'
        ];

        foreach($images as $key => $file) {
            $messages['files.'.$key.'.image'] = 'The upload file must be an image.';
            $messages['files.'.$key.'.mimes'] = 'The image must be one of the following types: JPEG, PNG, or GIF.';
        }
        return $messages;
    }

    public function authorize()
    {
        return true;
    }

    public function response(array $errors)
    {
        $request = $this->instance()->all();
        $images = $request['files'];
        $image = $images[0];

        $error_string = '';
        foreach($errors['files.0'] as $error) {
            $error_string.= ' '.$error;
        }

        $json = array('files' => array(
            array(
                'name' => $image->getClientOriginalName(),
                "size" => $image->getClientSize(),
                'error' => $error_string
            )
        ));

        return Response::json($json);
    }

}

【讨论】:

    【解决方案2】:

    当使用自定义请求执行验证时,由于某些原因,Laravel 不包含上传的文件。解决这个问题的第一种方法是使用手动验证器,就像在 Laravel 4 中一样。

    另一种方法是在请求中包含上传的文件。在您的扩展请求类中,添加以下内容:

    // 'massage' data so that files get in as well
    protected function getValidatorInstance()
    {
        $data = $this->all();
        $data['logo'] = $this->file('project_logo'); 
        $data['banner'] = $this->file('project_banner');
        $this->getInputSource()->replace($data);
    
        return parent::getValidatorInstance();
    }
    

    代码所做的是覆盖请求的getValidatorInstance() 方法,并手动将文件放入其中。在这种情况下,我有两个需要验证的文件,它们在 HTML 表单中的名称分别是 project_logoproject_banner

    【讨论】:

      【解决方案3】:

      这不是一个精确的解决方案,而是一个检查文件的简单技巧。

      if($request->file('docs')) {
      
      $extensions_allowed = ['pdf', 'docx'];
      
      foreach ($request->file('docs') as $file) {
      
         if(in_array($file->getClientOriginalExtension('docs'), $extensions_allowed)){
      
              return "yes----";
      
          }else {
      
             return "No-----";
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-10-27
        • 2014-09-11
        • 2015-11-29
        • 2021-02-11
        • 1970-01-01
        • 1970-01-01
        • 2017-09-01
        • 2019-08-22
        • 2016-12-29
        相关资源
        最近更新 更多