Подтвердить что ты не робот

Zend Framework: загрузка изображения

Я хочу загрузить изображение с Zend Framework версии 1.9.6. Загрузка сама по себе прекрасно работает, но я хочу еще пару вещей... и я полностью застрял.

  • Сообщения об ошибках при загрузке изображения не отображаются.
  • Если пользователь не вводит все обязательные поля, но загрузил изображение, я хочу отобразить загруженное изображение в моей форме. Либо как изображение, либо как ссылка на изображение. Только некоторая форма обратной связи с пользователем.
  • Я хочу использовать Zend_ Validate_ File_ IsImage. Но он ничего не делает.
  • И наконец; есть ли некоторые функции автоматического переименования?

Все идеи и предложения очень приветствуются. Я уже два дня борется.

Это упрощенные фрагменты кода:

myform.ini

method = "post"

elements.title.type = "text"
elements.title.options.label = "Title"
elements.title.options.attribs.size = 40
elements.title.options.required = true

elements.image.type = "file"
elements.image.options.label = "Image"
elements.image.options.validators.isimage.validator = "IsImage"

elements.submit.type = "submit"
elements.submit.options.label = "Save"

TestController

<?php
class Admin_TestController extends Zend_Controller_Action
{
  public function testAction ()
  {
    $config = new Zend_Config_Ini(MY_SECRET_PATH . 'myform.ini');
    $f = new Zend_Form($config);

    if ($this->_request->isPost())
    {
      $data = $this->_request->getPost();

      $imageElement = $f->getElement('image');
      $imageElement->receive();

      //$imageElement->getValue();

      if ($f->isValid($data))
      {
        //save data
        $this->_redirect('/admin');
      }

      else
      {
        $f->populate($data);
      }
    }

    $this->view->form = $f;
  }
}
?>

Мой взгляд просто отгоняет переменную 'form'.

4b9b3361

Ответ 1

Сначала поставьте это в начале вашего script:

error_reporting (E_ALL);//это должно показать все ошибки php

Я думаю, что сообщения об ошибках отсутствуют в форме, потому что вы повторно заполняете форму перед ее отображением. Я думаю, что вытирает любые сообщения об ошибках. Чтобы исправить это, удалите эту часть:

else
{
   $f->populate($data);
}

Чтобы показать загруженное изображение в форме, просто добавьте div в шаблон вашего вида, например:

<div style="float:right"><?=$this->image?></div>

Если изображение загружено в порядке, затем залейте $view- > изображение тегом img.

Что касается автоматического переименования, нет, он не встроен, но это очень просто. Я покажу вам, как внизу. Вот как я обрабатываю загрузку изображений:

$form = new Zend_Form();
$form->setEnctype(Zend_Form::ENCTYPE_MULTIPART);

$image = new Zend_Form_Element_File('image');
$image->setLabel('Upload an image:')
      ->setDestination($config->paths->upload)
      ->setRequired(true)
      ->setMaxFileSize(10240000) // limits the filesize on the client side
      ->setDescription('Click Browse and click on the image file you would like to upload');
$image->addValidator('Count', false, 1);                // ensure only 1 file
$image->addValidator('Size', false, 10240000);            // limit to 10 meg
$image->addValidator('Extension', false, 'jpg,jpeg,png,gif');// only JPEG, PNG, and GIFs

$form->addElement($image);

$this->view->form = $form;

if($this->getRequest()->isPost())
{
    if(!$form->isValid($this->getRequest()->getParams()))
    {
        return $this->render('add');
    }

    if(!$form->image->receive())
    {
        $this->view->message = '<div class="popup-warning">Errors Receiving File.</div>';
        return $this->render('add');
    }

    if($form->image->isUploaded())
    {
        $values = $form->getValues();
        $source = $form->image->getFileName();

        //to re-name the image, all you need to do is save it with a new name, instead of the name they uploaded it with. Normally, I use the primary key of the database row where I'm storing the name of the image. For example, if it an image of Person 1, I call it 1.jpg. The important thing is that you make sure the image name will be unique in whatever directory you save it to.

        $new_image_name = 'someNameYouInvent';

        //save image to database and filesystem here
        $image_saved = move_uploaded_file($source, '/www/yoursite/images/'.$new_image_name);
        if($image_saved)
        {
            $this->view->image = '<img src="/images/'.$new_image_name.'" />';
            $form->reset();//only do this if it saved ok and you want to re-display the fresh empty form
        }
    }
}

Ответ 2

Во-первых, ознакомьтесь с Краткое руководство. Обратите внимание, что у него есть ErrorController.php, который отобразит вам сообщения об ошибках. Также обратите внимание на то, как application.ini имеет эти строки, чтобы заставить PHP генерировать сообщения об ошибках, но убедитесь, что вы находитесь в среде разработки, чтобы увидеть их (что установлено в public/.htaccess).

phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

Во-вторых, ZF имеет фильтр переименования для загрузки файлов:

$upload_elt = new Zend_Form_Element_File('upload');
$upload_elt
->setRequired(true)
->setLabel('Select the file to upload:')
->setDestination($uploadDir)
->addValidator('Count', false, 1) // ensure only 1 file
->addValidator('Size', false, 2097152) // limit to 2MB
->addValidator('Extension', false, 'doc,txt')
->addValidator('MimeType', false, 
               array('application/msword',
                 'text/plain'))
->addFilter('Rename', implode('_', 
                  array($this->_user_id,
                    $this->_upload_category,
                    date('YmdHis'))))
->addValidator('NotExists', false, $uploadDir)
;

Некоторые из интересных вещей выше:

  • отметьте загрузку по мере необходимости (что ваш .ini не делает)
  • поместите все закачки в специальный каталог
  • ограничение размера файла и допустимых типов mime
  • переименовать загрузку в myuser_category_timestamp
  • не перезаписывать существующий файл (маловероятно, учитывая нашу временную схему, но пусть все равно)

Итак, вышеизложенное идет в вашей форме. В контроллере/действии, который получает загрузку, вы можете сделать это:

$original_filename = $form->upload->getFileName(null, false);
if ($form->upload->receive()) {
  $model->saveUpload(
    $this->_identity, $form->upload->getFileName(null, false),
    $original_filename
  );
}

Обратите внимание, как мы фиксируем $original_filename (если вам это нужно) перед тем, как принимать(). После получения() мы получаем getFileName(), чтобы получить то, что фильтр переименования выбран как новое имя файла.

Наконец, в методе model- > saveUpload вы можете хранить все содержимое базы данных.

Ответ 3

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

Ответ 4

При переходе на lo_fye я столкнулся с проблемами с пользовательскими декораторами. У меня нет установленного по умолчанию файла Decorator и получил следующее исключение:

Warning: Exception caught by form: No file decorator found... unable to render file element Stack Trace:

Ответ на этот вопрос заключается в том, что один из ваших декаторов должен реализовать пустой интерфейс Zend_Form_Decorator_Marker_File_Interface

Ответ 5

Также иногда возникает ошибка при использовании запроса ajax. Попробуйте это без запроса ajax и не забудьте многостраничную форму.