Allegati Multipli Ad Un Post


(G Grazioli) #1

Ciao a tutti.

Nell’applicazione che sto realizzando ogni utente può scrivere dei post e dovrebbe poter allegare dei file(immagini, pdf, ecc). Un po’ come la sezione attachments nella scrittura dei topic del forum; dopo l’upload(in ajax?) del singolo file, visualizzare ‘add to post’ oppure ‘delete’.

Qualche idea da cui partire?

Grazie mille


Help with date validation
(G Grazioli) #2

Sto provando eajaxupload, ma mi ritorna sempre ‘Failed’. Qualcuno di voi l’ha provato?


(St4nny) #3

si io lo utilizzo senza problemi,

qui un pezzo di codice funzionante:

VIEW




<?php

$this->widget('ext.EAjaxUpload.EAjaxUpload',

                 array(

                       'id'=>'uploadFile',

                       'config'=>array(

                                       'action'=>'uploadcsv/'.$model->id.'',

                                       'allowedExtensions'=>array("csv"),

                                       'sizeLimit'=>1*1024*1024,// maximum file size in bytes

                       				   'txtButton'=>'Seleziona il file csv',

                                       'onComplete'=>"js:function(id, fileName, responseJSON){ $.fn.yiiGridView.update('csv-grid');  }",

                                       'messages'=>array(

        'typeError'=>"{file} Estensione non valida. Sono permessi solo i file con estensione: {extensions}.",

        'sizeError'=>"{file} Il File è troppo grande, il massimo consentito è: {sizeLimit}.",

        'minSizeError'=>"{file} Il File è troppo piccolo, il minimo consentito è: {minSizeLimit}.",

        'emptyError'=>"{file} Il File è vuoto, riprovare con un altro file.",

        'onLeave'=>"I file verranno caricati. Se si abbandona ora questa modalità, l'upload non sarà effettuato."

        ),

           'showMessage'=>"js:function(message){ alert(message); }"

)

));

?>



CONTROLLER:




Yii::import("ext.EAjaxUpload.qqFileUploader");

$folder=$_SERVER['DOCUMENT_ROOT'].Yii::app()->request->baseUrl.'/csv/'; // folder for upload csv

		$allowedExtensions = array("csv");

		$sizeLimit = 1*1024*1024;

		$uploader = new qqFileUploader($allowedExtensions, $sizeLimit);

		$result = $uploader->handleUpload($folder,true);




(G Grazioli) #4

Ciao grazie mille, provo e faccio sapere :)


(G Grazioli) #5

Ciao, sto provando il codice, però non mi è chiaro questo

non dovrei scrivere




 'action'=>'miocontroller/upload'



anche se così facendo, la console del browser mi ritorna un POST (Not Found); per non ricevere questo errore devo scrivere




'action'=>'index.php?r=miocontroller/upload',



A questo punto nessun errore in console, solo il solito ‘Failed’ :(

Ho come l’impressione che al controller non arrivi nulla, anche se commento tutto il codice del controller, mi ritorna sempre Failed.


(Matteo Falsitta) #6

Io uso Plupload, e senza estensioni.

Vi consiglio in generale di includervi da voi le librerie js creandovi i vostri componenti, guardate questo wiki per avare una idea su come includerle.


(St4nny) #7

nel mio caso nell’action è specificato l’id perchè poi una volta caricato il file… mi serve fare della roba.

cmq controlla che la cartella abbia permessi impostati a 777 (per escludere i problemi di permessi)

stampati tutte le variabili del controller… e vedi se c’è qualcosa che non va.

controlla se effettivamente il file è stato messo nella cartella, il failed potrebbe venirti fuori anche per altre cose, magari perchè non gli ritorna un ok.


(G Grazioli) #8

Ciao, ti ringrazio, sono riuscito a farlo funzionare :)

Posso chiederti una cosa? quando eseguo l’upload, avendo necessità di modificare il nome del file, ho modificato il fileName in qqFileUploader.php, dentro la funzione handleUpload. Il filename che invece viene restituito è il nome del file originale, non quello modificato. Qualche idea su come recuperare il nuovo nome?


(G Grazioli) #9

Tutto questo perchè, una volta fatto l’upload, ho bisogno di recuperare l’elenco dei path dei file uplodati, per inserire nel db e associarli al post che verrà scritto. :blink:


(G Grazioli) #10

Nessuna idea? :unsure:


(St4nny) #11

scusami sono stato un pò assente :)

cmq se ti fossi stampato le variabili l’avresti trovato, il nome del file.




if($result['success']==1){

 $file = $folder.$result['filename'];

 $model1->file_allegato = file_get_contents($file);

 $model1->save();

}




(G Grazioli) #12

Ciao, ti rigrazio. Il mio problema è che non riuscivo a recuperare il nome del file caricato lato client.

Poi ho risolto capendo che lo potevo recuperare dentro al responseJSON con




'onComplete'=>"js:function(id, fileName, responseJSON){ 

    alert(responseJSON['filename']);

}",



:)


(G Grazioli) #13

Per caso tu riesci a fare l’upload di pdf e png? per queste due tipologie a me non funziona…


(Pellicanipasquale) #14

Io stò valutanto tra le due (Plupload & EAjaxUpload) qualcuno ha dei pro e contro da scrivere in merito… così, da mettere in guardia chi si avventura ad esplorarli ? :lol:

tnx


(St4nny) #15

no nessun problema con le estensioni




Nel Controller:

$allowedExtensions = array("png","jpg","doc","pdf","rtf","gif","zip","rar");

$sizeLimit = 10*1024*1024;

$uploader = new qqFileUploader($allowedExtensions, $sizeLimit);	


Nel Widget nella View:

'action'=>'azione',

'allowedExtensions'=>array("png","jpg","doc","pdf","rtf","gif","zip","rar"),

'sizeLimit'=>10*1024*1024,// maximum file size in bytes



controlla di aver scritto per bene gli array.

@paskuale io ho usato EAjaxUpload perchè c’era un’estensione pronta e non mi ha dati grossi problemi. però devo dire che in altri casi mi è capitato di utilizzare plupload ed è veramente fatto bene.


(Pellicanipasquale) #16

Si effettivamente ho abbracciato EAjaxUpload alla fine, solo che mi sfugge una cosa, volendo usare un form multistep (e anche multiModel ^^) come faccio a leggere nel post, i campi relativi ai file caricati ?

Ho un _form (view) che gestisce 2 models, modelA… e modelB, vorrei associare i campi del modelB all’estensione EAjaxUpload.

Perchè in realtà io i file li metto in una cartella /temp e poi al salvataggio di tutto il form, sposterei questi files nel posto + idoneo.

tnx


(Pellicanipasquale) #17

@giacomo io ho risolto scrivendo:


'action'=>Yii::app()->createUrl('//nomeController/action'),

magari ti torna utile, e avresti del codice + leggibile :)


(St4nny) #18

a questo punto penso dovresti usare ajax per popolarti i campi del modelB. ‘onComplete’=>“js:function(id, fileName, responseJSON){ $(’#idcampo’).val(fileName); }”,

ad esempio.

oppure se hai un codice del tipo: <div id="div">renderePartial per la form del ModelB</div>

potresti mandare un renderPartial con la form compilata con json, dopo l’upload.

e quindi: onComplete’=>“js:function(id, fileName, responseJSON){ $(’#div’).html(responseJSON.data);”

una cosa del genere.


(Pellicanipasquale) #19

Ho inserito nella view:


echo $form->hiddenField($modelFile, 'uf_title');

Però non avendo limiti al numero di files da caricare? Uso un separatore e concateno tutto nella input nascosta ? O creo dinamicamente una input di tipo "nome[$n]" per ogni file caricato ?

tnx


(St4nny) #20

si puoi fare una cosa del genere.




$('#uf_title').val($('#uf_title').val() + ','+fileName);



oppure ogni volta crea un input text con nome uf_title[] e poi te li salvi nel submit.

forse meglio la seconda… magari facendoli vedere anche con un readonly.