Usare FancyUpload con CakePHP

ATTENZIONE! Il post ha più di 2 anni e le informazioni contenute potrebbero essere obsolete (ad esempio a causa di un aggiornamento di versione rispetto agli elementi descritti o links modificati da siti esterni).

FancyUpload è uno script Flash che permette di rimpiazzare il classico file uploader html. Lo script è compatibile con tutti i browser tramite l'utilizzo delle librerie Mootools ed è molto semplie da implementare. Supporta la selezione multipla dei files, l'upload sequenziale e indica inoltre il progresso del caricamento mediante barre animate. Per utilizzarlo all'interno di sezioni del sito protette da password bisogna però prendere alcuni accorgimenti, altrimenti non sarà possibile eseguire correttamente il caricamento dei files. Infatti utilizzando le sessioni CakePHP rifiuta le connessioni provenienti da Flash ritenendole non autorizzate. Ecco come fare per risolvere il problema. Ipotizziamo di avere un controller Amministrzione con due funzioni: gallery_mod e gallery_upload. La prima è la pagina che contiene il form, la seconda riceve i dati dell'uploader e salva i files in una cartella del server.


<?
class AmministrazioneController extends AppController {

 var $helpers = array('Form','Javascript','Html','Session');
    var $components = array('Auth');
 var $pageTitle = 'Amministrazione';

 /**
 * pagina per la modifica delle foto associate ad una gallery
 */
 function gallery_mod($gallery_id){

 }

 /**
 * upload e salvataggio di una foto
 */
 function gallery_upload($gallery_id){
  /*
   SALVATAGGIO DEl FILE RICEVUTO
   .......
   .......
  */

  //output
  $result['result'] = 'success';
  $result['size'] = "Immagine caricata ({$size['mime']})";
        if (!headers_sent() )
        {
            header('Content-type: application/json');
        }
        echo json_encode($result);
        die();
 }
}
?>

Il codice di gallery_mod.ctp conterrà quindi gli script necessari e il form:


<?php
 //caricamento librarie mootools
 $javascript->link('librerie/mootools/mootools-1.2.4-core-yc.js', false);
 $javascript->link('librerie/mootools/mootools-1.2.4.4-more.js', false);
 //caricamento FancyUpload
 $javascript->link('librerie/uploader/Swiff.Uploader.js', false);
    $javascript->link('librerie/uploader/Fx.ProgressBar.js', false);
    $javascript->link('librerie/uploader/FancyUpload2.js', false);
    $javascript->link('librerie/uploader/lang/ita.js', false);
 //caricamento script pagina
 $javascript->link('amministrazione.js', false);
?>

<form action="/sito/amministrazione/gallery_upload/<?=$gallery_id;?>" method="post" enctype="multipart/form-data" id="form_upload_files">
    <fieldset id="fallback" style="visibility:hidden">
        <input type="file" name="files"  />
    </fieldset>

    ....
    ....
    ....

Come action del form c'è il richiamo alla funzione gallery_upload la quale riceverà i files per trattarli nella maniera opportuna. Trovandosi all'interno di un'area del sito ad accesso protetto tramite sessioni lo script non funzionerà e l'uploader riporterà un errore. Questo accade in quanto il controller (più precisamente il componente Auth) non trova i parametri della sessione corrente e riporta un accesso non autorizzato. Per risolvere il problema è sufficiente passare nell'url del form anche l'id della sessione in corso in modo che la connessione sia riconosciuta come valida. Nella view modifichiamo la action del form:



<form action="/sito/amministrazione/gallery_upload/<?=$gallery_id;?>/<?=$session->id();?>" method="post" enctype="multipart/form-data" id="form_upload_files">
    <fieldset id="fallback" style="visibility:hidden">
        <input type="file" name="files"  />
    </fieldset>

    ....
    ....
    ....

Mentre nel controller specifichiamo che il secondo parametro passato tramite GET è l'id della sessione. E' possibile modificare direttamente la funzione gallery_upload oppure inserire tutto nel callback beforeFilter:


    function beforeFilter() {
        parent::BeforeFilter();
  /* indica che il secondo parametro è l'id della sessione in corso*/
        if($this->action == 'gallery_upload'){
            $this->Session->id($this->params['pass'][1]);
            $this->Session->start();
        }
    }

 /**
 * upload e salvataggio di una foto
 */
 function gallery_upload($gallery_id){
  /*
   SALVATAGGIO DEl FILE RICEVUTO
   .......
   .......
  */
    ...........
    ...........

Condividi questo post


Commenti