Immagine caricata disponibile solo dopo aver aggiornato la pagina

Quando carico un’immagine, il file è stato salvato correttamente e il percorso è stato impostato correttamente. Ma l’immagine caricata non viene visualizzata immediatamente dopo l’invio del modulo. Solo quando ricarico la pagina, viene visualizzata l’immagine caricata.

Sto salvando il file caricato come di seguito:

InputStream is; try { File file = new File("C:\\****\\*****\\Documents\\NetBeansProjects\\EventsCalendary\\web\\resources\\images\\uploadPhoto.png"); is = event.getFile().getInputstream(); OutputStream os = new FileOutputStream(file); setUserPhoto("\\EventsCalendary\\resources\\images\\"+file.getName()); byte buf[] = new byte[1024]; int len; while ((len = is.read(buf)) > 0) { os.write(buf, 0, len); } os.close(); is.close(); } catch (IOException ex) { System.out.println(ex.getStackTrace()); } 

Perché l’immagine caricata viene visualizzata solo dopo aver ricaricato la pagina e come posso risolverlo?

Stai scrivendo il file direttamente nella cartella del progetto dell’IDE e il tuo intento sembra salvare il file nella cartella di distribuzione del webapp. Questa è una ctriggers idea e bene a causa dei seguenti 3 motivi principali:

  1. Le modifiche nella cartella del progetto dell’IDE non si riflettono immediatamente nella cartella di lavoro del server. C’è una sorta di lavoro in background nell’IDE che si occupa di sincronizzare la cartella di lavoro del server con gli ultimi aggiornamenti (questo è in termini IDE chiamato “publishing”). Questa è la causa principale del problema che stai vedendo.

  2. Nel codice del mondo reale ci sono circostanze in cui la memorizzazione dei file caricati nella cartella di distribuzione del webapp non funziona affatto. Alcuni server (per impostazione predefinita o configurazione) non espandono il file WAR distribuito nel file system del disco locale, ma invece completamente nella memoria. Non è ansible creare nuovi file nella memoria senza fondamentalmente modificare il file WAR distribuito e ridistribuirlo.

  3. Anche quando il server espande il file WAR distribuito nel file system del disco locale, tutti i file appena creati andranno persi durante una ridistribuzione o anche un semplice riavvio, semplicemente perché quei nuovi file non fanno parte del file WAR originale.

È necessario scrivere su un percorso fisso al di fuori del progetto / deploy cartella. Ad esempio, /var/webapp/uploads . Quindi, per ottenerlo dalla tua webapp, aggiungilo come nuovo contesto web al server.

In base alla tua domanda precedente, so che stai usando Glassfish 3.1. In questo server, si chiama “host virtuale”. Puoi configurarlo a livello di server nella console di amministrazione su http: // localhost: 4848 > Configurazione> Servizio HTTP> Server virtuali , oppure a livello di webapp aggiungendo la seguente riga a /WEB-INF/glassfish-web.xml ( il tuo IDE dovrebbe averlo creato automaticamente, nota che questo file è prima di Glassfish 3.1 chiamato sun-web.xml , quindi se vedi manuali / blog / tutorial che fanno riferimento a esso, sì è esattamente lo stesso file):

  

In entrambi i casi, dovresti essere in grado di utilizzare http: // localhost: 8080 / contextname / uploads / * per pubblicare le immagini caricate da nel solito modo.

Guarda anche:

  • Come caricare file sul server usando JSP / Servlet?
  • Modo consigliato per salvare i file caricati in un’applicazione servlet (contiene un esempio di configurazione di Tomcat)
  • Lettura / scrittura di un file di testo in un servlet, dove questo file deve essere memorizzato in JBoss? (contiene l’esempio di configurazione JBoss)
  • Il modo più semplice per fornire dati statici dall’esterno del server delle applicazioni in un’applicazione Web Java