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’.
<?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); }"
)
));
?>
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.
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.
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?
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.
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 ?
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.
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.
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);”
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 ?