Загрузка файла Zend Framework незаконно загружена - PullRequest
3 голосов
/ 26 декабря 2010

Я пытаюсь загрузить файлы в обычной форме с другими текстовыми полями.

Пока что файл загружается во временную папку, но не в папку назначения, я всегда получаю эту ошибку: «Файл» загружен незаконно. Это может быть возможной атакой ».

Я проверил имя файла временного файла, и у него правильный URL в правильной папке.

Что мне здесь не хватает.

        $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 '<pre>';
                    print_r($form->getValues());
                    die();
                }
                else
                {
                    $messages = $upload->getMessages();
                    echo implode("\n", $messages);
                    die();
                }

$ upload-> получить ( 'PDF'); это то, что не работает должным образом.

Ответы [ 4 ]

4 голосов
/ 28 сентября 2011

думаю, что в Zend Framework все могло улучшиться после того, как был задан этот вопрос.

В приведенном ниже коде показан рабочий пример надежной проверки файлов, включая настраиваемые сообщения об ошибках.

Ключевым моментом является то, что метод Zend_Form :: isValid () - это все, что вам нужно, вам не нужно проверять передачу файла отдельно

Ваше определение формы, обратите внимание, что валидаторы файлов добавляются , как если бы они были обычными валидаторами

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

ваш контроллер класса

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

    }

}
0 голосов
/ 31 августа 2016

Попробуйте это:

   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 '<pre>';
            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');
0 голосов
/ 13 августа 2015

Я знаю, что прошло уже пару лет, но вот правильный ответ, прежде чем вытащить свои волосы:

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

"Установить, будет ли файл загружен при получении значения. По умолчанию используется значение falseкоторый заставит receive () при вызове getValues ​​(). "

0 голосов
/ 05 сентября 2011

Я думаю, что вы, возможно, решили проблему ... поэтому я просто даю ответ, чтобы любой, кто сталкивается с этой ошибкой, мог найти решение с помощью этого ценного сообщения ... Я столкнулся со многими трудностями, чтобы решить эту проблему ....Надеюсь, это кому-нибудь поможет ...

Здесь проблема в том, что метод isValid вызывается дважды ... один раз при вызове

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

и второй в методе приема .. так что если вы продолжитеприведенный ниже код вне метода $ form-> isValid, чем ваш файл, будет загружен ..

$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 '<pre>';
    print_r($form->getValues());
    die();
}
else
{
    $messages = $upload->getMessages();
    echo implode("\n", $messages);
    die();
}

, но все равно вы получите ошибку при проверке других ваших элементов, но ваш файл будет загружен ...

...