Memorizzalo ovunque in una posizione accessibile tranne che nella cartella del progetto dell'IDE, ovvero la cartella di distribuzione del server, per i motivi menzionati nella risposta all'immagine caricata disponibile solo dopo aver aggiornato la pagina :
Le modifiche nella cartella del progetto dell'IDE non si riflettono immediatamente nella cartella di lavoro del server. C'è una specie di lavoro in background nell'IDE che si prende cura che la cartella di lavoro del server venga sincronizzata con gli ultimi aggiornamenti (questo è in termini IDE chiamato "pubblicazione"). Questa è la causa principale del problema che stai riscontrando.
Nel codice del mondo reale ci sono circostanze in cui l'archiviazione dei file caricati nella cartella di distribuzione della webapp non funzionerà affatto. Alcuni server (per impostazione predefinita o per configurazione) non espandono il file WAR distribuito nel file system del disco locale, ma invece completamente nella memoria. Non è possibile creare nuovi file nella memoria senza modificare sostanzialmente il file WAR distribuito e ridistribuirlo.
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.
Non ha molta importanza per me o chiunque altro dove esattamente sul file system del disco locale sarà salvato, fino a quando non non mai utilizzare getRealPath()
il metodo . Usare quel metodo è in ogni caso allarmante.
Il percorso verso la posizione di archiviazione può a sua volta essere definito in molti modi. Bisogna fare tutto da soli . Forse è qui che si crea la tua confusione perché in qualche modo ti aspettavi che il server facesse tutto automaticamente. Si prega di notare che @MultipartConfig(location)
non non specificare la destinazione finale di upload, ma la posizione di archiviazione temporanea per la dimensione del file caso supera la soglia memoria.
Pertanto, il percorso per la posizione di archiviazione finale può essere definito in uno dei seguenti modi:
hardcoded:
File uploads = new File("/path/to/uploads");
Variabile d'ambiente tramite SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
Argomento della macchina virtuale durante l'avvio del server tramite -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
voce del file come upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
con nome upload.location
e valore /path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
Se presente, utilizza la posizione fornita dal server, ad esempio in JBoss AS / WildFly :
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
In ogni caso, puoi facilmente fare riferimento e salvare il file come segue:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
Oppure, quando si desidera generare automaticamente un nome file univoco per impedire agli utenti di sovrascrivere file esistenti con lo stesso nome casualmente:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
Come ottenere part
in JSP / Servlet si risponde in Come caricare i file sul server utilizzando JSP / Servlet? e come ottenere part
in JSF si risponde in Come caricare file utilizzando JSF 2.2 <h: inputFile>? Dov'è il file salvato?
Nota: non utilizzare Part#write()
in quanto interpreta il percorso relativo alla posizione di archiviazione temporanea definita in @MultipartConfig(location)
.
Guarda anche: