2015-07-11 4 views
3

В моем приложении Laravel 5 предусмотрено, что администратор загружает изображение продукта и файл PDF продукта. Таким образом, форма имеет 2 поля ввода, как это:Laravel 5 TokenMismatchException при загрузке нескольких файлов

<div class="col-md-4 col-sm-6"> 
    <div class="form-group"> 
     {!! Form::label('image', 'Image File:') !!} 
     {!! Form::file('image', ['class' => 'form-control input-sm']) !!} 
    </div> 
</div> 

<div class="col-md-4 col-sm-6"> 
    <div class="form-group"> 
     {!! Form::label('leaflet', 'Leaflet:') !!} 
     {!! Form::file('leaflet', ['class' => 'form-control input-sm']) !!} 
    </div> 
</div> 

Когда я загрузить изображение и листовку как менее 2Мб, он получает успешно загружены. Но при использовании, листовка более 2Мб, я получаю TokenMismatchException at line 46

В моем php.ini файл, который находится в /etc/php5/apache2/php.ini у меня есть конфигурация, как так:

; Maximum allowed size for uploaded files. 
; http://php.net/upload-max-filesize 
upload_max_filesize = 2G 

; Maximum size of POST data that PHP will accept. 
; Its value may be 0 to disable the limit. It is ignored if POST data reading 
; is disabled through enable_post_data_reading. 
; http://php.net/post-max-size 
post_max_size = 6G 

файлы, которые я загружаю, (работает):

  1. изображение: Имя: цветочно-1.jpg Размер: 51.6kb
  2. PDF Имя: productInfo.pdf, Размер: 777.2kB

Файлы, которые я загружаю, (не работает - дает TokenMismatchException на линии 46 в VerifyCsrfToken.php):

  1. Изображение: Имя: цветочно-1.jpg, Размер: 51.6kb
  2. PDF Имя: ProductInfo-1.pdf, Размер: 5.00MB

контроллер

public function update($id, UpdateProductRequest $request) { 
    $product = $this->prod->findProductById($id); 

    $this->prod->updateProductOfId($product->id, $request); 

    Flash::success('product_general_info_updated', 'The product general information has been successfully updated.'); 

    return redirect()->back(); 
} 

/** 
* Coming from ProductRespository.php 
*/ 
public function updateProductOfId($id, Request $request) 
{ 
    $prd = $this->findProductById($id); 

    $getAllInput = $request->all(); 

    if($request->file('image')) 
    { 
     $imageType = array(
      'product' => array(
       'height' => 347, 
       'width' => 347 
      ), 
      'category' => array(
       'height' => 190, 
       'width' => 190 
      ) 
     ); 

     $imageFileName = $request->file('image')->getClientOriginalName(); 

     foreach ($imageType as $key => $value) 
     { 
      $currentFile = Input::file('image'); 
      $fileName = $currentFile->getClientOriginalName(); 
      $image = Image::make($request->file('image')); 
      $name = explode('.', $fileName); 
      $destinationPath = public_path().'/images/products/uploads'; 
      if ($key === 'product') { 
       $image->resize($value[ 'width' ], $value[ 'height' ]); 
       $image->save($destinationPath . '/' . $name[ 0 ] . "-" . $value[ 'width' ] . "-" . $value[ 'height' ] . ".jpg", 100); 
      } elseif ($key === 'category') { 
       $image->resize($value[ 'width' ], $value[ 'height' ]); 
       $image->save($destinationPath . '/' . $name[ 0 ] . "-" . $value[ 'width' ] . "-" . $value[ 'height' ] . ".jpg", 100); 
      } 
     } 
     $getAllInput['image'] = $imageFileName; 
    } 

    if($request->file('leaflet')) 
    { 
     $currentFile = Input::file('leaflet'); 
     $fileName = $currentFile->getClientOriginalName(); 
     $destinationPath = public_path().'/leaflets/products/uploads'; 

     $currentFile->move($destinationPath, $fileName); 
     $getAllInput['leaflet'] = $fileName; 
    } 
    return $prd->update($getAllInput); 
} 

Edit 1: Я использую Form Model Binding, так как create и edit файл имеет ту же форму:

<div class="container"> 
    @include('errors.list') 

    {!! Form::open(['url' => '/admin/products', 'autocomplete' => 'off', 'files' => true]) !!} 
     @include('admin.products.product_general_form', ['submitButtonText' => 'Add Product']) 
    {!! Form::close() !!} 
</div> 

EDIT 2: Просто для информации, я используя LAMP на архитектуре Ubuntu 14.04 LTS x64 бит. Это локальный хост. Я еще не разместил приложение.

Просьба помочь мне. Благодарю.

+0

Можете ли вы добавить свой код, где вы открываете форму в своем представлении, пожалуйста? –

+0

Вы используете Former для обработки ваших форм? Я не могу понять, как можно было бы загрузить файл до 2 МБ, но не более того. Какой веб-сервер вы используете здесь? (извините за ответ немного поздно) –

+0

Вы попробовали что-то вроде 'ini_get ('upload_max_filesize')', чтобы проверить, что максимальный размер файла upload был правильно установлен в файле conf? –

ответ

-3

Добавить {!! csrf_token() !!} в вашей форме для создания токена CSRF.

{!! Form::open(['url' => '/admin/products', 'autocomplete' => 'off', 'files' => true]) !!} @include('admin.products.product_general_form', ['submitButtonText' => 'Add Product']) <input type="hidden" name="_token" value="{!! csrf_token() !!}"> {!! Form::close() !!}

В настоящее время при подаче вашей формы, нет CSRF токен при условии, которая просит Laravel для связи с VerifyCsrfToken.php ППО.

+0

Спасибо за ваш вклад. Сэр, но я бы попросил вас снова прочитать мой вопрос. потому что я четко сказал, что файлы ниже 2 МБ загружаются, а больше, чем бросает «TokenMismatchException». И только для вашей информации, 'HTML Form Facade' включает' _token' по умолчанию. –

+0

Усилили ли вы max_execution_time в вашей конфигурации php? –

+0

И почему вы думаете, что мне нужно увеличить max_execution_time в моей конфигурации php? –

5

У меня была эта же проблема, и я смог ее решить, увеличив параметры UPLOAD_MAX_FILESIZE и POST_MAX_SIZE PHP. Первый должен быть больше, чем отдельные файлы, которые вы загружаете, а последний должен быть больше, чем сумма двух (или более) файлов, которые загружаются.

Там есть лучшее объяснение того, что это делает переменный $ _POST, которая ведет к этому представляя как символическое исключение несоответствия здесь:

http://laravel.io/forum/02-20-2014-l40-csrf-tokenmismatchexception-when-uploading-large-files

Надеется, что это работает для вас, если вы еще не решили эту проблему уже!

+0

POST_MAX_SIZE был для меня виновником. –

Смежные вопросы