Topic: [1.2] Multiple Upload Behavior
C'è qualcuno che utilizza un behavior per l'upload di files (non sole immagini) ?
Ne ho trovati un paio su Bakery e forum, avete qualche indicazione ?
La comunità italiana su CakePHP
You are not logged in. Please login or register.
Pages: 1
C'è qualcuno che utilizza un behavior per l'upload di files (non sole immagini) ?
Ne ho trovati un paio su Bakery e forum, avete qualche indicazione ?
Anch'io ne ho spulciati molti...Avevo difficoltà a integrare ognuno di loro. Risultato: ho scelto la mia strada.
- Modello "padre" chiamato "Attachment". Nel suo schema ci sono info per il file system, il checksum, la tipologia mime, la dimensione in bytes, ecc. Definisce un generico file caricato sul server e le associazioni condivise (es: tutti i files allegati sono associati a delle tags).
- Componente "Attachment" utilizzato dai controllers dei vari modelli "derivati": permette di caricare il file sul server in locazioni precise (differenziate secondo le esigenze) e di gestire a basso livello i files.
- I Controllers dei modelli derivati si occupano di gestire la logica ad alto livello delle specializzazioni (es: ImagesController, TextFilesController, SoundsController, ecc.).
Piano piano pensavo di spostare parte della logica in un Behaviour così da automatizzare opportunamente alcune operazioni (più che altro le associazioni).
Io ho risolto con un singolo behavior senza far ricorso né a component, né a controllers poichè le "variabili", come può essere la directory o l'estensione, sono configurabili all'invocazione del behavior.
Inoltre ho trovato molto utile poter utilizzare il valore di un campo o di una variabile o di una costante per definire il nome della directory dove salvare il file.
Il behavior di AD7six l'ho trovato in http://bin.cakephp.org/ e ho dovuto apportare alcune piccole modifiche per farlo funzionare correttamente e ora è sufficente un semplice $this->model->save() per la gestione trasparente del file caricato.
Ciao a tutti, sono nuovo! ![]()
Volevo chiedere se qualcuno può aiutarmi ad utilizzare questo behaviour per effettuare attachments generici. Non trovo in giro nessuno tutorial/esempio funzionante; tante persone dicono di usarlo, ma io non ci riesco. Non capisco come utilizzarlo, se devo utilizzare una tabella 'attachments' separata oppure basta un field nel mio modello.
Grazie per la disponibilità..
Ma esiste un Upload Behavior predefinito di cakephp??
Se ti può tornare comodo ti posto quello che uso io..
Ho modificato l'image upload behavior di AD7six adattandolo alle mie esigenze..
Lo puoi scaricare da qui:
http://bin.cakephp.org/view/147878614
Se hai dubbi fammi sapere
ciau
Intanto grazie mille!
Ora ti farò qualche domanda, molto probabilmente stupida, però ho iniziato da poco a usare cake e devo capire come funziona il tutto..
Allora, questo behaviour serve per "estendere" le funzionalità di un generico modello, nel senso che mi permette di dire ad esempio che un upload è associato al field "photo" del mio modello e deve memorizzare lì il path del file, poi spostare in una particolare cartella tale file caricato, cancellarlo quando si cancella quel record ecc, giusto? Come faccio praticamente ad ottenere questo?
Se poi voglio permettere di associare piu attachment ad un generico modello, come funziona? Ho letto qualcosa sul fatto che il modello è polimorfico, ma praticamente non ho capito come funziona. Se ho capito bene devo creare una nuova tabella attachment e tutti i relativi files di cake (model, controller ecc). Ma come gestisco questa nuova "meta-associazione"? Non so come spiegarmi...
Non è che avresti qualche piccolo pezzo di codice d'esempio?
ps: scusa se ti stresso.. E' che vorrei iniziare a capirci qualcosa..
Intanto grazie mille!
Ora ti farò qualche domanda, molto probabilmente stupida, però ho iniziato da poco a usare cake e devo capire come funziona il tutto..
Allora, questo behaviour serve per "estendere" le funzionalità di un generico modello, nel senso che mi permette di dire ad esempio che un upload è associato al field "photo" del mio modello e deve memorizzare lì il path del file, poi spostare in una particolare cartella tale file caricato, cancellarlo quando si cancella quel record ecc, giusto?
Esattamente, poi dipende da com'è fatto il behavior che stai utilizzando.. per esempio il behavior originale di AD7six da cui poi mi sono ricavato il mio, non gestiva l'eliminazione del file nel caso di cancellazione del record..
Come faccio praticamente ad ottenere questo?
Beh nel caso specifico di questo behavior ti basta dichiarare i campi che intedi utilizzare nel model della tua tabella.
Per esempio:
#
<?php
class Company extends AppModel {
var $name = 'Company';
//associo al model il behavior:
var $actsAs = array('MultipleUpload' =>
array(
//imposto il campo photo
'primo_campo' => array(
'field' => 'photo', //nome del campo
'dir' => "{IMAGES}company", //imposto il path su cui salvare l'immagine, in questo caso /app/webroot/img/company
'deleteMainFile' => true, //cancella il file caricato.
//deleteMainFile l'ho creata per non ritrovarmi con immagini di dimensioni enormi caricate dall'utente, in pratica mi tengo solo le thumbnails con le dimensioni che voglio io.. ma se vuoi ti basta settare a false e non ti cancella il file caricato..
'thumbsizes' => array(
//crea le seguenti thumbnails
'main_thumb' => array(
//dimensioni
'width' => 350,
'height' => 350,
//nome della thumbnail (main.nome_file.estensione_del_file per esempio main.pippo.jpg)
'name' => 'main.{$file}.{$ext}',
//ridimensiona l'immagine proporzionalmente ad essa.
// se fosse settato a false l'immagine verrebbe schiacciata o stirata per diventare 50x50 px
'autoResize' => true
),
'small_thumb' => array(
'width' => 50,
'height' => 50,
'name' => 'main.{$file}.{$ext}',
'autoResize' => false)
)
),
//imposto il secondo campo che intendo gestire come file generico
'secondo_campo' => array(
'field' => 'my_field',
'dir' => "{FILES}nome_cartella",
// se il file di cui si sta effettuando l'upload non è un immagine, per evitare problemi setta la seguente opzione a false, oppure passagli un array vuoto 'array()'
'thumbsizes' => null)
)
)
)
);
//funzioni di validazione, per info vedi il sorgente non sono niente di difficile, anzi credo di averle
//fatte anche male, se vuoi sistematele o createne di nuove
var $validate = array(
'photo' => array (
'valid_upload' => array (
'rule' => array('validateUploadedFile'),
'message' => 'File non valido',
'required' => true
),
'validFile' => array (
'rule' => array('validateFileExtension', array('gif', 'jpg', 'jpeg', 'png')),
'message' => 'File non valido, inserire solo file jpg/jpeg, gif o png'
),
'maxFileSize' => array(
'rule' => array('maxFileSize', 2097152),
'message' => 'File non valido, inserire file di dimensioni inferiori ai 2 MegaByte'
)
)
}
?>Se poi voglio permettere di associare piu attachment ad un generico modello, come funziona? Ho letto qualcosa sul fatto che il modello è polimorfico, ma praticamente non ho capito come funziona. Se ho capito bene devo creare una nuova tabella attachment e tutti i relativi files di cake (model, controller ecc). Ma come gestisco questa nuova "meta-associazione"? Non so come spiegarmi...
Non è che avresti qualche piccolo pezzo di codice d'esempio?
ps: scusa se ti stresso.. E' che vorrei iniziare a capirci qualcosa..
Cosa intendi per "gestire più attachmen per un unico modello" ??
Nel senso che hai più campi su cui fare l'upload per un unico record?
oppure vuoi creare una relazione 1 ad N (uno a molti o has many) su due modelli per esempio
User hasMany File?
Comunque in pratica i passi che devi seguire sono i seguenti:
-Crei il file /app/model/behavior/multiple_upload.php con il behavior linkato precedentemente
-Setti il model della tua tabella come da esempio
-Nelle form di add o edit ricordati di aggiungere come parametro 'type' => 'file' altrimenti non funziona niente..
<?php echo $form->create('TuoModel', array('type' => 'file'); ?>vedi qui per maggiori info http://book.cakephp.org/view/303/file-fields
-In fine quando viene eseguito il metodo $this->TuoMetodo->save($this->data) se tutto va a buon fine ti ritrovi con il nome del file salvato nel db e il file savato nel path da te specificato
Comunque se hai dubbi guarda il sorgente dovrebbe essere circa comprensibile..
Ora devo scappare sto finalmente per partire per le ferie ![]()
Comunque tra una settimana torno.
Spero di esserti stato utile
Ciau
Ho guardato la Behavior.. complimenti ben fatta ![]()
Ora mi chiedo: se alleghi anche una bella documentazione su come funziona potremmo anche presentarla come si deve.. ![]()
Ti ringrazio, saluti.
Ho guardato la Behavior.. complimenti ben fatta
Ora mi chiedo: se alleghi anche una bella documentazione su come funziona potremmo anche presentarla come si deve..Ti ringrazio, saluti.
Beh grazie, anche se non è tutta farina del mio sacco.
Comunque ho ancora qualche miglioramento da fargli, e poi (non appena avrò un po' di tempo) gli farò un adeguata documentazione.
Ciau
Ciao dalpo, scusami per il ritardo, ma in questo ultimo mese ho avuto un pochino di problemini di salute...maledetti calcoli renali e chi li ha inventati!!!
Comuqnue, tornando a noi, ho provato oggi il tuo behavior...spettacolo!! Ho alcune domande da farti..spero di non stressare troppo..
Allora, per ora lo sto provando ad utilizzare senza tabelle secondarie (tipo 'attachments' per fare relazioni 1..N). Uso quindi il campo 'photo' nella tabella 'companies' (facendo sempre riferimento al tuo codice di esempio che hai postato).
Volevo capire, è giusto che il campo 'photo' di tipo VARCHAR (che alla fine conterrà il nome del file salvato) venga usato nelle viste come input di tipo 'file'?
Come faccio poi, ad esempio, a memorizzare nella stessa tabella in altri campi il vero nome del file, il suo mime-type, la dimensione ecc?
Altra cosa, c'è un modo per recuperare, all'interno di una vista, il percorso in cui è stato salvato il file? Cioè, se volessi visualizzare l'immagine caricata, dove recupero l'url dell'immagine? E' vero che io programmatore so dove le vado a salvare, ok, però se volessi rendere tutto parametrico, cioè modificando solo il codice del modello e automaticamente avere tutto a posto? Vorrei riuscire a leggere il parametro 'dir' del behavior dentro il modello corrispondente alla vista in cui voglio visualizzare l'immagine. Non so se mi sono spiegato..
Poi ho provato ad usare due campi distinti per fare due upload simultanei come hai messo nell'esempio. Finchè ne uso uno solo è tutto ok, ma se provo ad usarli entrambi non funziona. Per 'usarli entrambi' intendo avere due field distinti nella tabella del DB e nel form della vista 'add' avere due input di tipo file: uno per una immagine ed uno per un generico file.
Ciao,
d@d0
Last edited by d@d0 (09-09-2008 08:32:52)
Io purtroppo non sono riuscito a farlo funzionare anche con un campo solo.
Per fugare ogni dubbio. Quando si dice:
-Crei il file /app/model/behavior/multiple_upload.php con il behavior linkato precedentemente
-Setti il model della tua tabella come da esempio
-Nelle form di add o edit ricordati di aggiungere come parametro 'type' => 'file' altrimenti non funziona niente..
immagino che si sia dato per scontato che bisogna aggiungere sempre nella vista
echo $form->file('nome_del_campo.submittedfile');giusto?
perchè non mi salva e mi restituisce
Notice (8): Undefined index: error [APP\models\behaviors\multiple_upload.php, line 764]
Notice (8): Undefined index: error [APP\models\behaviors\multiple_upload.php, line 770]
Notice (8): Undefined index: error [APP\models\behaviors\multiple_upload.php, line 799]
Notice (8): Undefined index: name [APP\models\behaviors\multiple_upload.php, line 800]
Notice (8): Undefined index: size [APP\models\behaviors\multiple_upload.php, line 821]
???
Ops! Ho tolto .submittedfile e funzia. come non detto:)![]()
Ops! Ho tolto .submittedfile e funzia. come non detto:)
Errare è umano ![]()
Ciao a tutti.
Scusate se sono un po' assente, ma sono in pieno traslocco e non ho ancora internet nella casa nuova..
Ciao dalpo, scusami per il ritardo, ma in questo ultimo mese ho avuto un pochino di problemini di salute...maledetti calcoli renali e chi li ha inventati!!!
Comuqnue, tornando a noi, ho provato oggi il tuo behavior...spettacolo!! Ho alcune domande da farti..spero di non stressare troppo..
Allora, per ora lo sto provando ad utilizzare senza tabelle secondarie (tipo 'attachments' per fare relazioni 1..N). Uso quindi il campo 'photo' nella tabella 'companies' (facendo sempre riferimento al tuo codice di esempio che hai postato).
Volevo capire, è giusto che il campo 'photo' di tipo VARCHAR (che alla fine conterrà il nome del file salvato) venga usato nelle viste come input di tipo 'file'?
Giustissimo
Come faccio poi, ad esempio, a memorizzare nella stessa tabella in altri campi il vero nome del file, il suo mime-type, la dimensione ecc?
Dunque in linea teorica, (non l'ho mai sperimentato in pratica), se definisci nella tabella i campi: 'dir', 'mimetype', 'filesize', questi dovrebbero essere popolati in automatico dal behavior.
Vedi righe 240-244 del codice
$model->data[$model->name]['dir'] = str_replace(ROOT . DS . APP_DIR . DS, '', $dir);
$model->data[$model->name]['mimetype'] = $model->data[$model->name][$field]['type'];
$model->data[$model->name]['filesize'] = $model->data[$model->name][$field]['size'];
$model->data[$model->name][$field] = $model->data[$model->name][$field]['name'];Altra cosa, c'è un modo per recuperare, all'interno di una vista, il percorso in cui è stato salvato il file? Cioè, se volessi visualizzare l'immagine caricata, dove recupero l'url dell'immagine? E' vero che io programmatore so dove le vado a salvare, ok, però se volessi rendere tutto parametrico, cioè modificando solo il codice del modello e automaticamente avere tutto a posto? Vorrei riuscire a leggere il parametro 'dir' del behavior dentro il modello corrispondente alla vista in cui voglio visualizzare l'immagine. Non so se mi sono spiegato..
Ho capito cosa intendi, ma non mi ero mai posto il problema prima...
una possibile soluzione, potrebbe essere quella di salvarsi il path del db con il campo dir (se funziona
)
Comunque mi metto un todo da implementare un metodo per recuperare il path dei file
Poi ho provato ad usare due campi distinti per fare due upload simultanei come hai messo nell'esempio. Finchè ne uso uno solo è tutto ok, ma se provo ad usarli entrambi non funziona. Per 'usarli entrambi' intendo avere due field distinti nella tabella del DB e nel form della vista 'add' avere due input di tipo text: uno per una immagine ed uno per un generico file.
Ciao,
d@d0
Quest'ultimo problema potrebbe essere duvuto dal fatto che mi sono dimenticato di dirvi, che per file diversi da immagini, bisogna specificare anche i seguenti parametri:
'allowedMime' => array('image/jpeg', 'image/pjpeg', 'image/gif', 'image/png', 'image/x-png'),
'allowedExt' => array('jpg','jpeg','gif','png')Questi sono i valori di default, per files diversi come pdf o altro dovete specificare le corrette estensioni e i relativi mime.
per esempio:
var $actsAs = array('MultipleUpload2' =>
array(
'pdf' => array(
'field' => 'pdf',
'dir' => "{FILES}galleries",
'deleteMainFile' => false,
'thumbsizes' => array(),
'allowedExt' => array('pdf'),
'allowedMime' => array('application/pdf')
)
)
); Comunque il Behavior necessita ancora di parecchie modifiche, ed è molto probabile che ci sia qualche baco qua e la ![]()
Inoltre, potete trovare l'elenco completo dei parametri da passare nella definizione dei campi, nelle prime righe del Behavior
per ulteriori problemi fatemi sapere.
Ciau
Non capisco, il Behavior mi funziona perfettamente in locale con windoz, in produzione (linux ubuntu) non va a buon fine l'update sulla tabella mentre mi salva correttamente il file caricato nella cartella con utente e gruppo www-data.
Avete un'idea su cosa devo metter mano?![]()
uhm strano..
ma impostando nelle configurazioni del core.php
Configure::write('debug', 2);
non ti viene segnalato nessun problema??
dimenticavo..
puoi provare a fare un test di inserimento con la cache di cackephp disabilitata?
grazie per la risposta, alla fine ho risolto commentando l'istruzione che genera una copia dell'immagine con le dimensioni volute (thumbsizes)
var $actsAs = array('MultipleUpload' =>
array(
'imgpath' => array(
'field' => 'imgpath',
'dir' => "{IMAGES}giocatori",
'deleteMainFile' => false,
'thumbsizes' =>array(/*
'main' => array('width' => 260, 'height' => 420, 'name' => 'main.{$file}.{$ext}', 'autoResize' => true)*/
)
)
)
);Non so il motivo e non ho indagato molto anche perchè di solito carico l'immagine già dimensionata corretta.![]()
d@d0 wrote:Come faccio poi, ad esempio, a memorizzare nella stessa tabella in altri campi il vero nome del file, il suo mime-type, la dimensione ecc?
Dunque in linea teorica, (non l'ho mai sperimentato in pratica), se definisci nella tabella i campi: 'dir', 'mimetype', 'filesize', questi dovrebbero essere popolati in automatico dal behavior.
Ciao dalpo.
Allora, ieri avevo un'oretta libera e mi sono rimesso un pochino sul tuo behavior, perchè credo che possa essere utile a tutti, in quanto comodissimo e soprattutto ben fatto! ![]()
Ho provato a capire come recuperare il nome del file caricato, e "credo" che bisogna modificare il codice circa alle righe 240-250 (nella parte // Update model data), aggiungendo l'istruzione:
$model->data[$model->name]['realname'] = $model->data[$model->name][$field]['realname'];prima che venga perso con l'assegnamento
$model->data[$model->name][$field] = $model->data[$model->name][$field]['name'];Non so se sia corretto farlo in questo modo, ma cosi funziona come dici tu: se nel DB metto il campo realname allora lì dentro in automatico ci va a finire il nome del file che l'utente ha caricato dal suo pc (può sempre servire,no?).
Ora invece sto provando a trovare un modo per recuperare l'url delle immagini/files (e non il path sul filesystem che si può recuperare con la funzione $this->_getPath(...)).
La prima cosa che ho trovato, è che nel DB viene salvato nel campo dir il percorso con dentro ancora i markers (tipo {IMAGES} ecc). Quindi ho risolto con una cosa del genere (sempre nello stesso blocco di codice):
$model->data[$model->name]['dir'] = str_replace(APP, '', $this->_getPath($model,$fileValues,$dir));al posto di
$model->data[$model->name]['dir'] = str_replace(ROOT . DS . APP_DIR . DS, '', $dir);A questo punto, nel campo dir del DB mi ritrovo il percorso sul filesystem a partire da APP (tipo webroot/img/company).
Ecco, ora qual è l'url che devo usare nelle funzioni $html->url() oppure $html->image() per visualizzare correttamente le immagini o per fornire un link per il download di un file?
Grazie a chiunque altro mi possa dare una mano..
Last edited by d@d0 (13-10-2008 15:49:53)
Posts [ 19 ]
Pages: 1
0 guests and 0 users are reading this topic now
Powered by PunBB
Currently used extensions: pun_topic_online_users, pun_karma, pun_admin_hook_navigator, pun_bbcode. Copyright © 2008 PunBB
[ Generated in 0.067 seconds, 12 queries executed ]