2016-03-12 4 views
0

Я хочу сделать простое действие по загрузке файлов (несколько). Прикрепленные файлы я получаю от клиента, как:ZF2: проверка прикрепленного файла

var data = new FormData(); 
_.some(this.collection.models, function(model, index) { 
     data.append('file_'+index, model.get('_FILE')); 
} 

На стороне сервера я пытаюсь выполнить процесс проверки через Http адаптер. Предположим, что один файл прилагается:

$_files = $this->params()->fromFiles(); 

print_r($_files[0]); 

$extension = new \Zend\Validator\File\Extension('jpeg,jpg'); 
$adapter = new \Zend\File\Transfer\Adapter\Http(); 

$adapter->addValidator($extension); 

if($extension->isValid($_files[0])) 
{ 
    echo 'valid'; 
} else { 
    $messages = $extension->getMessages(); 
    echo implode("\n", $messages); 
} 

if($adapter->isValid($_files[0])) 
{ 
    echo 'valid'; 
} else { 
    $messages = $adapter->getMessages(); 
    echo implode("\n", $messages); 
} 

... и метод $ adapter-> IsValid() не действует. Но $ extension-> isValid() отлично работает.

Array ( 
    [name] => untitled_test.png 
    [type] => image/png 
    [tmp_name] => /tmp/phpRPlV8G 
    [error] => 0 [size] => 398 
) 

ответ

0

Для загрузки файла имеется специальный валидатор Zend\Validator\File\UploadFile. Я думаю, вам стоит подумать об использовании этого класса. Вы можете найти дополнительную информацию об этом here in the documentation.

Он автоматически используется в классе FileInput, который является специальным типом ввода для загружаемых файлов, найденных в массиве $_FILES.

Подробнее о том, как использовать/внедрить это in the official ZF2 documentation here.

0

Когда я создаю экземпляр конструктора класса \ Zend \ File \ Transfer \ Adapter \ Http(), загружает все опубликованные файлы ($ _FILES) по умолчанию. Вот мое полное решение. Может быть, кто-то будет полезен.

/** 
* Upload multiple images 
* 
* @return JsonModel 
*/ 
public function imageAction() 
{ 
    $request = $this->getRequest(); 
    $uploadStatus = []; 

    if ($request->isXmlHttpRequest()) 
    { 
     $models = $this->params()->fromPost('models'); 

     $adapter = new \Zend\File\Transfer\Adapter\Http(); 

     $size  = new \Zend\Validator\File\Size(['min' => '100B', 'max' => '10MB','useByteString' => true]); 
     $extension = new \Zend\Validator\File\Extension(['jpg','gif','png','jpeg'], true); 

     if (extension_loaded('fileinfo')) 
     { 
      $adapter->setValidators([new \Zend\Validator\File\IsImage()]); 
     } 

     $adapter->setValidators([$size, $extension]); 

     foreach($models as $index => $rawModel) 
     { 
      /** 
      * Parse JSON model 
      */ 
      $model = json_decode($rawModel,true); 
      /** 
      * Get full filename 
      */ 
      $_file = $adapter->getFileInfo('file_'.$model['index'])['file_'.$model['index']]['name']; 

      if (!$adapter->isValid($_file)) 
      { 
       foreach ($adapter->getMessages() as $key => $msg) 
       { 
        $uploadStatus['errorFiles'][] = $_file.' '.strtolower($msg); 
       } 
      } 

      $filename = $this->appPlugin()->generateFilename($model['name']); 
      $filepath = $this->appPlugin()->getImageDestination(); 

      $adapter->addFilter('File\Rename', ['target' => $filepath.$filename, 'overwrite' => true]); 

      if (!$adapter->receive($_file)) 
      { 
       $uploadStatus["errorFiles"][] = $_file.' was not uploaded'; 
      } else { 
       $uploadStatus["successFiles"][] = $_file.' was successfully uploaded'; 
      } 
     } 
    } 

    return new JsonModel(['uploadStatus'=>$uploadStatus]); 
} 

Полный пример здесь http://learnzf2.sitrun-tech.com/learn-zf2-ajax-image-gallery. Благодарим сообщество.

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