Speichern Sie es an einem beliebigen Ort mit Ausnahme des Projektordners der IDE, auch bekannt als Bereitstellungsordner des Servers, aus Gründen, die in der Antwort auf das hochgeladene Image angegeben sind und erst nach dem Aktualisieren der Seite verfügbar sind :
Änderungen im Projektordner der IDE werden nicht sofort im Arbeitsordner des Servers angezeigt. Es gibt eine Art Hintergrundjob in der IDE, der dafür sorgt, dass der Arbeitsordner des Servers mit den letzten Aktualisierungen synchronisiert wird (dies wird in IDE-Begriffen als "Veröffentlichung" bezeichnet). Dies ist die Hauptursache für das Problem, das Sie sehen.
Im realen Code gibt es Umstände, unter denen das Speichern hochgeladener Dateien im Bereitstellungsordner der Webanwendung überhaupt nicht funktioniert. Einige Server erweitern (entweder standardmäßig oder per Konfiguration) die bereitgestellte WAR-Datei nicht in das lokale Festplattendateisystem, sondern vollständig im Speicher. Sie können keine neuen Dateien im Speicher erstellen, ohne die bereitgestellte WAR-Datei zu bearbeiten und erneut bereitzustellen.
Selbst wenn der Server die bereitgestellte WAR-Datei in das lokale Festplattendateisystem erweitert, gehen alle neu erstellten Dateien bei einer erneuten Bereitstellung oder sogar einem einfachen Neustart verloren, einfach weil diese neuen Dateien nicht Teil der ursprünglichen WAR-Datei sind.
Es ist wirklich egal , mir oder jemand anderes , wo genau auf dem Dateisystem der lokalen Festplatte der sie gespeichert wird, solange man sie nicht immer verwenden getRealPath()
Methode . Die Verwendung dieser Methode ist auf jeden Fall alarmierend.
Der Pfad zum Speicherort kann wiederum auf viele Arten definiert werden. Du musst alles alleine machen . Vielleicht wird hier Ihre Verwirrung verursacht, weil Sie irgendwie erwartet haben, dass der Server das alles automatisch macht. Bitte beachten Sie, dass @MultipartConfig(location)
sie nicht das letzte Upload - Ziel angeben, aber der temporäre Speicherort für die Fall , Dateigröße überschreitet Schwellenspeicher.
Der Pfad zum endgültigen Speicherort kann also auf eine der folgenden Arten definiert werden:
Hardcodiert:
File uploads = new File("/path/to/uploads");
Umgebungsvariable über SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
VM-Argument beim Serverstart über -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
Dateieintrag als upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
mit Name upload.location
und Wert /path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
Verwenden Sie gegebenenfalls den vom Server bereitgestellten Speicherort, z. B. in JBoss AS / WildFly :
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
In beiden Fällen können Sie die Datei wie folgt referenzieren und speichern:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
Oder wenn Sie einen eindeutigen Dateinamen automatisch generieren möchten, um zu verhindern, dass Benutzer vorhandene Dateien mit zufällig demselben Namen überschreiben:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
Wie man part
in JSP / Servlet erhält, wird in Wie lade ich Dateien mit JSP / Servlet auf den Server hoch? und wie man part
in JSF erhält, wird in Wie lade ich eine Datei mit JSF 2.2 <h: inputFile> hoch? Wo ist die gespeicherte Datei?
Hinweis: Verwenden Sie diese Option nicht , Part#write()
da sie den Pfad relativ zum in definierten temporären Speicherort interpretiert @MultipartConfig(location)
.
Siehe auch: