Come caricare il file usando JSF 2.2 ? Dov’è il file salvato?

Mi piacerebbe poter caricare file nella mia applicazione web JSF2.2, quindi ho iniziato a utilizzare il nuovo componente .

La mia unica domanda è, come posso specificare la posizione, dove i file verranno salvati nel server? Mi piacerebbe trovarli come istanze java.io.File . Questo deve essere implementato nel backing bean, ma non capisco chiaramente come.

JSF non salverà il file in alcuna posizione predefinita. Fondamentalmente ti offrirà semplicemente il file caricato nel gusto di un’istanza javax.servlet.http.Part che è dietro le quinte memorizzata temporaneamente nella memoria del server e / o nella posizione di archiviazione temporanea su disco di cui non dovresti preoccuparti.

Per salvarlo nella posizione desiderata, è necessario ottenere il contenuto dalla Part#getInputStream() e quindi copiarlo sul Path rappresenta la posizione. Puoi farlo nel modo (ajax) dell’azione (ascoltatore) nel solito modo. Ecco un esempio che fa con un ascoltatore ajax durante l’evento di change DOM HTML:

      
 private Part file; // +getter+setter public void save() { try (InputStream input = file.getInputStream()) { Files.copy(input, new File(uploads, filename).toPath()); } catch (IOException e) { // Show faces message? } } 

La cartella di uploads e il filename del filename sono completamente sotto il tuo controllo. Ad esempio "/path/to/uploads" e Part#getSubmittedFileName() rispettivamente. Tieni presente che qualsiasi file esistente verrà sovrascritto, potresti voler utilizzare File#createTempFile() per generare automaticamente un nome file.

Non utilizzare Part#write() Scrittura parziale Part#write() come suggerito da un suggerimento. In pratica, rinominerà il file nel percorso di archiviazione temporaneo identificato da @MultipartConfig(location) . Inoltre, non utilizzare ExternalContext#getRealPath() per salvare il file caricato nella cartella di distribuzione. Il file andrà perso quando WAR viene ridistribuito per il semplice motivo che il file non è contenuto nel WAR originale. Salvalo sempre su un percorso assoluto al di fuori della cartella di distribuzione.

Per una demo dal vivo, controlla l’ultimo elemento della demo su OmniFaces showcase .

Guarda anche:

  • Scrivi il file su disco usando l’input file di JSF 2.2
  • Come salvare il file caricato in JSF
  • Modo consigliato per salvare i file caricati in un’applicazione servlet