View Full Version : Apache Commons FileUpload JAVA
loop4633
15-09-2012, 20:29
Ciao a tutti, da qualche giorno sorge un problemino che non riesco a risolvere, vi spiego sperando che qualcuno mi dia una mano :)
Ho creato una servlet che sfruttano le apache commons mi permette di uploadare file e caricare il nome del file sul database, poi tramite una pagina jsp visualizzo le foto che vengono caricate. Il problema è che quando effettuo l'upload e visualizzo le foto la foto inserita non si vede, ma compare null al posto della foto, se faccio il refresh sulla cartella dove vengono caricare le foto come per magia lo slide la vede e tutto funziona regolare! :muro:
Qualcuno di voi conosce qualche metodo per fare aggiornare automaticamente questa cartella alla servlet? O qualche metodo .flush che mi permetta di aggiornare qualcosa? o devo fare il .close() di qualcosa? Bho sto impazzendo, spero che qualcuno sappia e voglia darmi una mano...
come visualizzi la foto?
A intuito, non sapendo bene come fai, direi che il problema è più dello slide che dell'upload!
loop4633
16-09-2012, 07:52
Grazie per la tua risposta Lancill, cerco di essere chiaro ma non è facile: dunque io clicco su "visualizza album" questo fa il submit forzato su una pagina jsp normalissima in cui ho soltanto un pulsante "getalbum" e un campo nascosto in cui memorizzo il codice utente che sta effettuando la richiesta, quindi questa pagina "jsp normalissima" chiama la servlet Getalbum passandogli il codice utente che ha fatto la richiesta, questa servlet a sua volta fa la query al db prende nomedell'album (e la prima foto legata a questo) didascalia e data e li manda a slideralbum.jsp questo non fa altro che prendere i dati che arrivano dalla servlet che saranno ovviamente campi Vector e tramite un for li alloco in un vettore javascript, successivamente prendo la dimensione del vector (me lo passa sempre la servlet) e con un altro for stampo il vettore appena fatto in javascript che mi stamperà il nome degli album con la prima foto, data e descrizione. Quando clicco sull'album questo mi rimanda ad una pagina praticamente vuota con submit forzato, questa contiene soltanto il codice album in un campo nascosto e il pulsante da forzare ovviamente, quando viene forzato il submit su questa pagina vengo riportato sulla servlet Getimage, questa funziona come Getalbum sopra citata, prende tutti le foto associate a quell'album e mi rimanda su slider.jsp, qui di nuovo alloco il vettore prendendo i dati dai vector della servlet e ricorsivamente li stampo:
immagine.innerHTML="<img border=0 src=/imagesharing/images/"+url[counter]+"><br><br>"+data[counter]+" "+didascalia[counter];
E fin qui tutto ok. Sotto questa foto che viene stampata ho un semplicissimo pulsante choose file e upload che mi permette di caricare una nuova foto sull'album, quando upload viene premuto ovviamente vengo riportato ad una servlet Upload che carica l'immagine sul server, inserisce il nome della foto sul db nell'apposito album dell'utente e mi effettua un redirect su slideralbum.jsp, in modo che io sarò costretto a cliccare nuovamente sull'album e questo essendo collegato alla servlet Getimage rieseguirà la richiesta al db e otterrà i dati aggiornati. Infatti se entro nell'album su cui ho messo la nuova foto, effettivamente compare una foto nuova, con data e descrizione, ma la foto non la vedo... ammenoche non vada a fare il refresh sulla cartella in cui la servlet Upload memorizza le foto, se faccio il refresh compare la foto senza bisogno di aggiornare pagina o cose del genere mi basta cliccare su avanti o indietro e mi compare la nuova foto.
Spero di essere stato chiaro :)
beh, a parte qualche passaggio "contorto" che fai, ma forse perché non conosco alcuni dettagli delle tue esigenze, direi che il problema potrebbe essere semplicemente di caching.
Prova ad inserire i meta-tag per disabilitare il caching automatico:
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
magari basta quello!
p.s.: ma per refresh sulla cartella intendi proprio quello fatto tramite sistema operativo sul file system?
loop4633
16-09-2012, 11:37
Niente come immaginavo il problema persiste... non avevo inserito il metatag ma avevo provato più volte a cancellare la cache, sta cosa è incredibile.
p.s.: ma per refresh sulla cartella intendi proprio quello fatto tramite sistema operativo sul file system?
Si penso che faccia esattamente questo, non so se hai mai utilizzato o utilizzi eclipse, comunque ti compaiono tutti i file e le cartelle del progetto nella colonna a sx faccio click col tasto dx sulla cartella interessata e seleziono refresh, lui non fa altro che aggiornare i file in quella cartella. Infatti se faccio l'upload dei file e vado (da eclipse stesso) ad aprire questa cartella la foto appena caricata non la vedo, faccio il refresh e compare. Per quello stavo ipotizzando che potesse essere un problema di refresh sulla cartella...
ah ma tu esegui il tutto da eclipse?
Eclipse Indigo o precedente?
Prova a far girare tutto fuori da Eclipse.
Io con le versioni fino ad Indigo avevo un sacco di problemi di refresh perché Eclipse si crea una sua cache per far girare il progetto internamente.
Ti consiglio di aggiornare a Juno, decisamente migliore e non mi da più i problemi di refresh!
loop4633
16-09-2012, 11:50
Si eseguo da eclipse, ma in verità l'altro ieri ho provato ad eseguirlo direttamente da Tomcat che ho installato e avevo lo stesso problema, però non ricordo se avevo cancellato la cache del browser dal momento che ho fatto un milione di prove fin ora... più tardi provo e vediamo. Comunque di eclipse uso Indigo proverò ad aggiornare la versione... non so perchè tutti utilizzino eclipse ma io lo odio. Netbeans tutta la vita, peccato che possiede qualcosa in meno di eclipse...
Grazie infinite per il tuo aiuto :) Più tardi provo e ti aggiorno
Ps: complimenti per il blog
Ok, fammi sapere se era quello il problema!
Eclipse sono gioie e dolori, io ci programmo da una vita e devo dire che configurato secondo le proprie esigenze è veramente ottimo.
Grazie per i complimenti sul blog, gentilissimo! :stordita:
loop4633
16-09-2012, 22:19
Niente purtroppo anche provando direttamente su tomcat il problema persiste quindi mi sembra inutile cambiare eclipse... dovrei andare a riconfigurare tutto... sto problema mi sta facendo impazzire
quindi hai provato senza passare da eclipse (quindi con eclipse chiuso)?
In questo caso hai dovuto fare il refresh sulla cartella immagini del tuo progetto nella webapps di tomcat?
Se è così, non resta che l'ipotesi di un flusso che rimane aperto sull'immagine un po' troppo o non viene chiuso.
Però senza vedere codice è un po' dura :stordita:
loop4633
16-09-2012, 22:59
Si si, il refresh non l'ho fatto ma in teoria i mac dovrebbero farlo in automatico... almeno in teoria!
Non è un problema, se hai voglia e tempo mi dici quali file ti servono e li posto
beh a occhio direi Upload e GetImage... ma nella pratica i pezzi di codice che hanno a che fare con l'immagine incriminata
loop4633
17-09-2012, 10:01
Credo possano bastare questi:
http://pastebin.com/P5GYMrTz <-- UPLOAD
http://pastebin.com/M5qsDCUB <-- GETIMAGE
http://pastebin.com/mLjKe6uk <-- SLIDER
grazie :)
Ciao, scusa il ritardo, solo oggi ho avuto 10 minuti per guardare il codice...
non ho controllato attentamente, ma a occhio mi sembra che non chiudi il file dopo averlo scritto nella servlet Upload... mi è sfuggito qualcosa?
loop4633
18-09-2012, 09:45
No, non ti è sfuggito niente, anche io ho avuto questo dubbio... ma leggendo la documentazione (correggimi se sbaglio) mi è sembrato di capire che per i File non ho bisogno di chiudere, non è uno stream... :muro: (infatti non ho alcun metodo .close())
si infatti mi sono espresso male, intendevo di chiudere lo stream per la scrittura del file... ma credo che non c'è un metodo esplicito nella libreria di Apache che utilizzi.
Io ti suggerisco di fare una prova salvando il file "manualmente" e non con il metodo write();
Prova come fanno qua:
http://www.jedi.be/blog/2009/04/10/java-servlets-and-large-large-file-uploads-enter-apache-fileupload/
loop4633
18-09-2012, 10:14
Grazie mille, questa sera provo e ti aggiorno :)
loop4633
19-09-2012, 22:25
Ovviamente non sono sparito, sto rifacendo la servlet, ho scoperto che con le servlet3 non ho bisogno di apache commons :)
Appena ho 10 min di poter finire di sistemare e testare ti aggiorno, ieri ho fatto una bozza veloce, comunque se funziona significa che il problema con apache commons era quello... si deve usare lo stream per forza, servlet3 utilizzano lo stream.
loop4633
03-10-2012, 21:20
Rieccomi, sono stato un po indaffarato. Comunque il problema non si risolve neanche con le servlet3 e quindi con streaming, stesso identico problema di aggiornamento.
ma debuggando non sei riuscito a notare nessun valore imprevisto?
A questo punto direi che l'unico modo per svelare il mistero è proprio vedere step by step che cosa sta succedendo.
loop4633
03-10-2012, 21:31
Onestamente ho fatto tante di quelle prove che non so più cosa controllare, ne da cosa possa dipendere questo problema, domani voglio provarlo su qualche pc con tomcat installato... nn ho proprio idea di cosa possa provare ancora
si, penso sia una buona idea! Fammi sapere come va... così nel caso peggiore proviamo qualche altra strada!
loop4633
03-10-2012, 21:37
Si ti aggiorno, mi sembra il minimo dopo il tuo impegno... solo che per adesso sono un po incasinato, ma non sparisco :)
La butto lì: e se il problema fosse da qualche altra parte? Ad esempio un antivirus che ti blocca il file durante la scrittura e ti impiccia il refresh...
loop4633
03-10-2012, 21:52
Lavoro su mac osx e non ho antivirus quindi escluderei il problema :)
loop4633
13-10-2012, 10:59
Niente, non c'è verso di fare comparire le immagini! Rimane da chiamare l'esorcista...
io continuo a sostenere sia un problema di cache.
Prova a forzare Javascript a caricare la corretta immagine.
Ad esempio quando carichi l'immagine fai una cosa di questo tipo qua: immagine.src = "http://localhost/immagine.jpg?" + new Date();
o al posto di new Date() qualcosa di randomico che ti forzi a caricare la giusta immagine (se non erro da specifiche le url con parametri non dovrebbero essere cacheable).
loop4633
14-10-2012, 21:45
Grazie ancora per i tuoi tentativi, ho appena provato col Date() e purtroppo continua a non cambiare nulla, domani provo col timing o qualcos'altro... ti aggiorno :)
loop4633
15-10-2012, 12:25
Adesso lasciando stare che ieri sera col Date() almeno visualizzavo le immagini mentre oggi non le vedo più... ho analizzato il risultato che restituisce la pagina... è come se lui cercasse un path sbagliato se forzo col random, cerco di essere più chiaro...
Io ho questo codice:
document.getElementById('realfoto').src="/imagesharing/images/"+url[counter]+"?"+new Date();
lui mi aggancia quello che ritorna Date() ad url[counter] e dopo cerca di caricarla dal server, ma ovviamente non esiste un file con quel nome e non vedo nulla... la stessa cosa succede col numero random che ho creato io... analizzando la pagina leggo:
Uncaught SyntaxError: Unexpected token ? Getimage:99
Uncaught ReferenceError: assegnaVettore is not defined
loop4633
15-10-2012, 21:05
Ok, ho sistemato l'errore che avevo, purtroppo odiando javascript tendo a javeggiare un po troppo, mi ero complicato un po troppo la vita, adesso ho risolto col fatto del random passato come parametro javascript, ma comunque l'immagine appena caricata continua a non vedersi... onestamente ci sto abbandonando le speranze è un problema assurdo! :mc:
loop4633
16-10-2012, 14:04
Misteriosamente ho trovato la soluzione... in pratica è un problema di eclipse... La cosa che non capisco è come mai non funzionava quando lo facevo girare direttamente sul server... Comunque basta inserire
String serverPath= getServletContext().getRealPath("/");
E creare successivamente una stringa formata da serverPath+folder+nomeimg in questo modo lui carica le immagini direttamente sulla cartella del server e di conseguenza saranno direttamente disponibili quando si sfoglia l'album.
Spero dopo tutta sta trafila di tornare utile a qualcuno :)
Grazie mille Lancill!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.