Blogial

« Post precedente


Multipli uploads con Zend Framework.

Metti al top

Ciao e benvenuto.

Sono stato molto impegnato in questi ultimi periodi, questa è la ragione della non eccelsa frequenza di aggiornamento di questo blog ;).

Bando alle ciance, oggi illustrerò un semplice e veloce metodo per effettuare upload multipli con lo Zend Framework.

Il codice per ora prevede solamente i files con una unica estensione (in questo caso jpg).

In caso di upload multipli con più di una estensione permessa, bisogna per forza di cose intervenire lato controller.

La nostra form

Codice php:
class Form_MyForm extends Zend_Form
{
    const N_UPLOADS = 4;
    
    public function init()
    {
        $this->setMethod('post');
        $this->setAttrib('enctype', 'multipart/form-data');
        $this->setAttrib('id','myform');
        $this->setAttrib('class','myform');
        
         // Nome
        $this->addElement('text', 'nome', array(
            'required'   => true,
            'maxlength' => 255,
            'label' => 'Nome :',
            'title' => 'nome',
            'filters'    => array('StripTags','StringTrim'),
            'validators' => array(
                array('StringLength',false,array(3,25)))
        ));
        
        // Directory di destinazione
        $uploadDir = realpath(dirname(__FILE__) . '/../../uploads').'/';
        // Upload Images 
        foreach(range(1,self::N_UPLOADS) as $k => $v){
            $options = (1===$v)? array(
                'required'   => true,
                'ignore' => true,
                'title' => 'Foto',
                'class'     => 'input-file',
                'label' => 'Tua foto :',
                'destination' =>  $uploadDir,
                'validators' => array(
                    array('Count', false, self::N_UPLOADS),
                    array('Size', false, 2097152),
                    array('Extension', false, 'jpg,pjpeg'),
                    array('IsImage', false,'jpeg'),
                )):
                array(
                'ignore' => true,
                'title' => 'Foto',
                'class'     => 'input-file',
                'label' => 'Tua foto',
                'destination' =>  $uploadDir,
                'validators' => array(
                    array('Size', false, 2097152),
                    array('Extension', false, 'jpg,pjpeg'),
                    array('IsImage', false,'jpeg'),
                ));
            $this->addElement('file', 'photo'.$v,$options );
            $upload = $this->getElement('photo'.$v);
            $upload->addDecorator('Description', array('placement' => 'prepend'));
            $upload->addFilter('Rename', $uploadDir.substr(sha1(uniqid(microtime())),0,10). '.jpg' );
        }
        
        //Csrf
        $this->addElement('hash', 'csrf', array(
            'ignore' => true
        ));
        
        // Submit 
        $this->addElement('submit', 'ask_submit', array(
            'ignore'   => true,
            'class' => 'ads-submit',
            'label'    => 'Submit',
        ));
        
    }
}

Con questo codice si ha la creazione dinamica di inputs tipo file oltre al campo hidden con name MAX_FILE_SIZE (nel ns. caso 2MB), solo il primo lo rendiamo obbligatorio.

Il nostro controller

Codice php:

class IndexController extends Zend_Controller_Action
{
    protected $_request;
    public function init()
    {
        $this->_request = $this->getRequest();
    }

    public function indexAction()
    {
        $form = new Form_MyForm(array('action'=>$this->_helper->url('index')));
        $extraData= array();
        if ($this->_request->isPost()) { 
             if ($form->isValid($this->_request->getPost())){
                $photos = array();
                foreach(range(1,Form_MyForm::N_UPLOADS) as $k => $v){
                    $tmp = $form->{'photo'.$v};
                    if ($tmp->isUploaded()) {
                        if(!$tmp->receive()){
                            $tmp->setDescription('Invalid upload');
                            $this->view->form = $form;
                            return;
                        }
                        $photo = $this->_getFileName($tmp);
                        array_push($photos, $photo);
                    }
                    // Qui puoi gestire il resize
                }
                $extraData['photos'] = serialize($photos);
                // dati da inserire nel Db 
                $data = array_merge($form->getValues(),$extraData);
                //var_dump($data);exit();
                // inserisci i dati nel db e fai il redirect
                return $this->_helper->redirector('index','index'); 
             }
        }
        $this->view->form = $form;
    }
    
    protected function _getFileName(Zend_Form_Element_File $file)
    {
        $name = $file->getFileName(null,false);
        return $name;
    }

}

Da notare l'uso di serialize per storare tutte le immagini nel database.

Puoi scaricare una demo qui.

Alla prossima ;) .

Inserisci il tuo commento

Inserisci il codice che leggi nell'immagine

antispam

Nb.
Devi avere i cookie abilitati per commentare l'articolo.
I commenti saranno soggetti ad approvazione da parte dell'administrator.

Gli articoli in evidenza

Php Trouble Tickets

Metti al top

Script opensource php mysql per la gestione delle richieste degli utenti tramite ticket.

Si tratta di un software gratuito che gira su piattaforme Linux, Windows (Apache).

Permette la completa gestione dei rapporti commerciali, tra voi e i vostri clienti, attraverso il sistema basato sui trouble tickets.

Distribuito sotto licenza MIT ha le seguenti caratteristiche:

  • - Valid css e xhtml strict;
  • - unobtrusive javascript utilizzando il framework jQuery;
  • - multilanguages;
  • - aggiungi/edita/cancella/chiudi/assegna trouble tickets e risposte;
  • - nessuna limitazione sul numero di utenti, amministratori e staff di supporto;
  • - permessi agli operatori, accesso separato utenti;
  • - gruppi di operatori con gestione permessi (CRUD);
  • - illimitate e nested categories;
  • - paging;
  • - moduli di ricerca;
  • - tables sortable;
  • - nessun limite sul numero di TT creabili.

Potete visionare una demo qui.