2015-07-11 88 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> 

當我上載超過2MB的圖像和單張都不到,它就會被上傳成功。但在使用時,小葉大於2MB,我得到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

,我上傳的文件(不工作 - 在VerifyCsrfToken.php在第46行給出TokenMismatchException):

  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); 
} 

編輯1: 我使用Form Model Binding,這樣既createedit文件具有相同的形式:

<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> 

編輯2: 只是爲了信息,我在Ubuntu 14.04 LTS x64位架構上使用LAMP。這是一個本地主機。我還沒有託管該應用程序。

請幫助我。謝謝。

+0

您可以在您的視圖中打開表單的位置添加代碼嗎? –

+0

您是否使用Former處理您的表單?我無法理解你如何將文件上傳到2 MB,但不能再更新。你在這裏使用什麼網絡服務器? (抱歉回答遲了) –

+0

您是否嘗試過類似'ini_get('upload_max_filesize')'來檢查您的最大上傳文件大小是否已由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

謝謝您的輸入,先生,但我會請你再讀一遍我的問題。因爲我已經清楚地表明,低於2MB的文件正在上傳,而大於此值則拋出'TokenMismatchException'。僅僅爲了您的信息,HTML Form Facade默認包含'_token'。 –

+0

您是否增加了php配置中的max_execution_time? –

+0

爲什麼你認爲我需要在我的PHP配置中增加max_execution_time? –

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是我的罪魁禍首。 –