2009-12-08 2 views
12

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

  • Сообщения об ошибках при загрузке изображения не отображаются.
  • Если пользователь не вводит все обязательные поля, но загрузил изображение, я хочу отобразить загруженное изображение в моей форме. Либо как изображение, либо как ссылка на изображение. Только некоторая форма обратной связи с пользователем.
  • Я хочу использовать 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; 
    } 
} 
?> 

мой взгляд просто эхо это переменная 'форма'.

ответ

19

Во-первых, поставить это в начале вашего скрипта:

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's 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 
     } 
    } 
} 
0

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

2

во-первых, посмотрите на Quick Start учебник. Обратите внимание, что у него есть 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 Безразлично» t, похоже, делает)
  • положить все закачки в специальный каталог
  • ограничение размер файла a г приемлемые типы 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 вы можете хранить все, что угодно, в вашей базе данных.

0

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

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

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

0

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

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