Allegati Multipli Ad Un Post come quello di questo forum
#1
Posted 08 November 2012 - 10:34 AM
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
#2
Posted 08 November 2012 - 11:40 AM
#3
Posted 09 November 2012 - 09:22 AM
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);
#5
Posted 11 November 2012 - 07:51 AM
st4nny, on 09 November 2012 - 09:22 AM, said:
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.
#7
Posted 12 November 2012 - 10:26 AM
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.
#8
Posted 13 November 2012 - 12:38 PM
st4nny, on 12 November 2012 - 10:26 AM, said:
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?
#9
Posted 13 November 2012 - 01:25 PM
#11
Posted 19 November 2012 - 04:25 AM
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();
}
#12
Posted 19 November 2012 - 05:27 AM
st4nny, on 19 November 2012 - 04:25 AM, said:
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();
}
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']);
}",
#13
Posted 19 November 2012 - 07:28 AM
st4nny, on 19 November 2012 - 04:25 AM, said:
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();
}
Per caso tu riesci a fare l'upload di pdf e png? per queste due tipologie a me non funziona..
#14
Posted 19 November 2012 - 08:01 AM
tnx
#15
Posted 20 November 2012 - 06:36 AM
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.
#16
Posted 20 November 2012 - 07:09 AM
Quote
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
#17
Posted 20 November 2012 - 07:40 AM
Giacomo, on 11 November 2012 - 07:51 AM, said:
'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.
@giacomo io ho risolto scrivendo:
'action'=>Yii::app()->createUrl('//nomeController/action'),magari ti torna utile, e avresti del codice + leggibile
#18
Posted 20 November 2012 - 08:23 AM
paskuale, on 20 November 2012 - 07:09 AM, said:
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
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.
#19
Posted 20 November 2012 - 08:28 AM
st4nny, on 20 November 2012 - 08:23 AM, said:
ad esempio.
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
#20
Posted 20 November 2012 - 09:10 AM
paskuale, on 20 November 2012 - 08:28 AM, said:
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
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.

Help















