Zend Framework: resim upload

5 Cevap php

Ben Zend Framework sürüm 1.9.6 ile bir resim yüklemek istiyorum. Yükleme kendisi çalışıyor, ama ben de diğer şeylerin bir çift istiyoruz ... ve ben tamamen şaşırıp.

  • Bir görüntü yüklemek için başarısız olduğu için hata iletileri görünmüyor.
  • Bir kullanıcı tüm gerekli alanları girmiyor ama bir görüntü yükledi sonra ben benim formunda yüklenen görüntüyü görüntülemek istiyorum. Ya bir görüntü veya görüntüye bir bağlantı olarak. Kullanıcı geribildirim sadece bazı formu.
  • Ben Zend_ Validate_ dosya_ IsImage kullanmak istiyorum. Ama hiçbir şey görünmüyor.
  • Ve son olarak; bazı otomatik yeniden adlandırma işlevleri vardır?

Tüm fikirler ve öneriler çok açığız. Ben şimdi iki gün boyunca mücadele ettik.

Bu basitleştirilmiş kod parçacıkları şunlardır:

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;
  }
}
?>

Benim görüşüm sadece echo 'form' değişken bulunuyor.

5 Cevap

İlk olarak, senaryonun başlangıcında bu koymak:

error_reporting (E_ALL) ;/ / Bu tüm php hatalarını göstermek gerekir

Bunu görüntülemek önce formu yeniden doldurmak çünkü hata iletileri formundan eksik olduğunu düşünüyorum. Ben herhangi bir hata mesajları mendil düşünüyorum. Bunu gidermek için bu bölümü kaldırın:

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

Şeklinde yüklenen görüntü göstermek için, sadece bu gibi, görünüm şablonuna bir div eklemek:

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

Görüntü tamam yükledi, sonra bir img etiketi ile $ view-> görüntü doldurmak.

As for automatic re-naming, no, it's not built in, but it's very easy. I'll show you how below. Here's how I handle my image uploads:

$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
        }
    }
}

İlk olarak, Quick Start öğretici bir göz var. Sizin için hata iletileri görüntüler bir ErrorController.php sahiptir nasıl unutmayın. Ayrıca application.ini PHP hata iletileri yayarlar neden, ama onları (kamu / .htaccess set edildiği) görmek için "kalkınma" bir ortamda olduğunuzdan emin olmak için bu satırları vardır nasıl not.

phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

İkincisi, ZF dosya yüklemeleri için bir yeniden adlandırma filtre vardır:

$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)
;

Yukarıdaki ilginç bazı şeyler:

  • gerektiği gibi yükleme işaretlemek (hangi. ini yapmak için görünmüyor)
  • özel bir dizindeki tüm yüklenenler koymak
  • sınır dosya boyutu ve kabul edilebilir mim tipleri
  • myuser_category_timestamp için yükleme adlandırmak
  • (bizim damgası düzeni verilmiş, olası, fakat en emin yine de yapalım) varolan bir dosyanın üzerine yok

Yani, yukarıdaki şeklinde gider. Yükleme aldığı denetleyici / eylem, bunu yapabilirsiniz:

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

Aldığımız yapmadan önce $ original_filename (Eğer gerekiyorsa) () yakalamak nasıl unutmayın. Biz () aldıktan sonra, biz yeniden adlandırma filtre yeni dosya adı olarak aldı o şeyi almak için getFileName () yapmak.

Son olarak, model> saveUpload yönteminde veritabanınıza ne şeyler saklamak olabilir.

Lütfen görünümü de denetleyicisi oluşturmak herhangi bir hata mesajı verir emin olun: yükleme hataları, alan geçerlilik, dosya doğrulama. Yeniden adlandırma iş olması, bu tür görüntü-magick tarafından dönüştürmek gibi olur diğer post işleme gibi. Olur

When following lo_fye's listing I experienced problems with custom decorators. I do not have the default File Decorator set and got the following exception:

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

Bunun cevaplama decrators biri boş arayüz Zend_Form_Decorator_Marker_File_Interface uygulamak gerekir ki

Bir ajax isteği kullanırken de bazen hata olur. Bir ajax isteği olmadan deneyin ve çok parçalı formu unutma.