Carga de archivos de Zend Framework cargados ilegalmente

Intento cargar archivos dentro de una forma normal con otros campos de texto.

Hasta ahora, el archivo se carga a una carpeta temporal pero no a mi carpeta de destino, siempre recibo este error “Subir archivo ‘fue subido ilegalmente. Esto podría ser un posible ataque”.

He comprobado el nombre de archivo del archivo temporal y tiene la URL correcta en la carpeta correcta.

Que me estoy perdiendo aqui.

$form = new Zend_Form(); $form->setAttrib('enctype', 'multipart/form-data'); $form->setMethod('post') ->addElement('file', 'pdf', array( 'size' => '40', 'label' => 'Select File', 'required' => true, 'validators' => array( 'Size' => array('min' => 20, 'max' => 1000000) ) ) ) ->addElement('submit', 'Save') ; if ( $this->getRequest()->isPost() ) { if ( $form->isValid($this->getRequest()->getParams()) ) { $id = $form->getValue('name'); $upload = new Zend_File_Transfer_Adapter_Http(); $uploadDestination = APPLICATION_PATH . '/../public/uploads/'.$id; if(!is_dir($uploadDestination)){ mkdir($uploadDestination, 0777, true); } $upload->setDestination($uploadDestination); echo $upload->getFileName(); if($upload->receive('pdf')) { echo '
'; print_r($form->getValues()); die(); } else { $messages = $upload->getMessages(); echo implode("\n", $messages); die(); } 

$ upload-> receive ('pdf'); es lo que no funciona correctamente

Creo que las cosas pueden haber mejorado en Zend Framework desde que se hizo esta pregunta.

El siguiente código muestra un ejemplo de trabajo de una validación de archivos robusta, que incluye mensajes de error personalizados.

El punto clave es que el método Zend_Form :: isValid () es todo lo que necesita, no necesita validar la transferencia de archivos por separado

La definición de su formulario, tenga en cuenta que los validadores de archivos se agregan como si fueran validadores normales

 class Jogs_Form_ImportForm extends Zend_Form { public function init() { $this->setAttrib('enctype', 'multipart/form-data'); $this->setAttrib( 'id', 'form-import' ); $importAction = $this->addElement('radio', 'importAction', array( 'multiOptions' => array( 'components' => 'Import components', 'layouts' => 'Import layouts', 'layoutComponents' => 'Import layout components', ), 'required' => true, 'label' => 'Import Type:', )); $upload = $this->addElement( 'file', 'import-file', array( 'label' => 'Text (tab delimited) file (.txt)', 'validators' => array( 'Size' => array('max' => 10*1024*1024), 'Extension' => array('txt', 'messages' => array( Zend_Validate_File_Extension::FALSE_EXTENSION => 'file must end with ".txt"' ) ), 'MimeType' => array( 'text/plain', 'messages' => array( Zend_Validate_File_MimeType::FALSE_TYPE => 'file must be text (tab delimited)' ) ), ) ) ); $go = $this->addElement('submit', 'go', array( 'required' => false, 'ignore' => true, 'label' => 'Go', )); } } 

su clase de controlador

 class ImportController extends Zend_Controller_Action { public function indexAction(){ $form = new Polypipe_Form_ImportForm(); $this->view->form = $form; if ( $this->getRequest()->isPost() && $form->isValid( $this->getRequest()->getPost() ) ){ $data = $form->getValues(); // get the file info $ft = $form->getElement('import-file')->getTransferAdapter(); $fileInfo = $ft->getFileinfo(); } } } 

Creo que es posible que hayas resuelto el problema … así que solo estoy dando una respuesta para que cualquier persona que enfrente este error pueda encontrar la solución a través de esta valiosa publicación … Me enfrenté a muchas dificultades para resolver este problema … Espero que ayude alguien…

Aquí el problema es que el método Valid se llama dos veces … una vez cuando llamas

 if ( $form->isValid($this->getRequest()->getParams()) ) { } 

y segundo en el método de recepción … así que si mantienes el código a continuación fuera del método $ form-> isValid, tu archivo se cargará.

 $upload = new Zend_File_Transfer_Adapter_Http(); $uploadDestination = APPLICATION_PATH . '/../public/uploads/'.$id; if(!is_dir($uploadDestination)){ mkdir($uploadDestination, 0777, true); } $upload->setDestination($uploadDestination); echo $upload->getFileName(); if($upload->receive('pdf')) { echo '
'; print_r($form->getValues()); die(); } else { $messages = $upload->getMessages(); echo implode("\n", $messages); die(); }

pero aún obtendrá el error cuando valide sus otros elementos pero su archivo será cargado ...

Sé que han pasado un par de años, pero esta es la respuesta correcta antes de sacar tu cabello:

 $form->yourElement->setValueDisabled( true ); 

“Establecer si el archivo se cargará al obtener el valor. Esto es falso por defecto, lo que obligará a recibir () al llamar getValues ​​()”.

Prueba esto:

  if ( $this->getRequest()->isPost() ) { if ( $form->isValid($this->getRequest()->getParams()) ) { $id = $form->getValue('name'); $upload = new Zend_File_Transfer_Adapter_Http(); $uploadDestination = APPLICATION_PATH . '/../public/uploads/'.$id; if(!is_dir($uploadDestination)){ mkdir($uploadDestination, 0777, true); } $upload->setDestination($uploadDestination); echo $upload->getFileName(); if($upload->receive('pdf')) { echo '
'; print_r($form->getValues()); die(); } else { $messages = $upload->getMessages(); echo implode("\n", $messages); die(); } } } $form = new Zend_Form(); $form->setAttrib('enctype', 'multipart/form-data'); $form->setMethod('post') ->addElement('file', 'pdf', array( 'size' => '40', 'label' => 'Select File', 'required' => true, 'validators' => array( 'Size' => array('min' => 20, 'max' => 1000000) ) ) ) ->addElement('submit', 'Save');