Przechowuj go w dowolnym miejscu w dostępnej lokalizacji, z wyjątkiem folderu projektu IDE, czyli folderu wdrażania serwera, z powodów wymienionych w odpowiedzi na Przesłany obraz dostępny tylko po odświeżeniu strony :
Zmiany w folderze projektu IDE nie są natychmiast odzwierciedlane w folderze roboczym serwera. W IDE jest coś w rodzaju zadania w tle, które dba o to, aby folder roboczy serwera był synchronizowany z ostatnimi aktualizacjami (w terminologii IDE nazywa się to „publikowaniem”). To jest główna przyczyna napotkanego problemu.
W prawdziwym kodzie istnieją sytuacje, w których przechowywanie przesłanych plików w folderze wdrażania aplikacji sieci Web w ogóle nie zadziała. Niektóre serwery (domyślnie lub przez konfigurację) nie rozszerzają wdrożonego pliku WAR do lokalnego systemu plików dysku, ale zamiast tego w całości umieszczają go w pamięci. Nie można tworzyć nowych plików w pamięci bez zasadniczo edytowania wdrożonego pliku WAR i ponownego jego wdrożenia.
Nawet jeśli serwer rozszerzy wdrożony plik WAR do lokalnego systemu plików na dysku, wszystkie nowo utworzone pliki zostaną utracone po ponownym wdrożeniu lub nawet po prostym ponownym uruchomieniu, po prostu dlatego, że te nowe pliki nie są częścią oryginalnego pliku WAR.
To naprawdę nie ma znaczenia dla mnie czy kogokolwiek innego, gdzie dokładnie na lokalnym systemie plików na dysku zostanie on zapisany, tak długo, jak nie nie zawsze używać getRealPath()
metody . Stosowanie tej metody jest w każdym razie niepokojące.
Z kolei ścieżkę do miejsca przechowywania można zdefiniować na wiele sposobów. Musisz to wszystko zrobić sam . Być może jest to przyczyną twojego zamieszania, ponieważ w jakiś sposób spodziewałeś się, że serwer zrobi to wszystko automagicznie. Należy pamiętać, że @MultipartConfig(location)
nie nie określenie miejsca docelowego wysyłania, ale tymczasowe miejsce składowania dla rozmiaru pliku przypadek przekracza próg przechowywania pamięci.
Tak więc ścieżkę do ostatecznego miejsca przechowywania można zdefiniować na jeden z następujących sposobów:
Mocno zakodowane:
File uploads = new File("/path/to/uploads");
Zmienna środowiskowa za pośrednictwem SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
Argument maszyny wirtualnej podczas uruchamiania serwera za pośrednictwem -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
wpis pliku jako upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
z nazwą upload.location
i wartością /path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
Jeśli istnieje, użyj lokalizacji udostępnionej przez serwer, np. W JBoss AS / WildFly :
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
Tak czy inaczej, możesz łatwo odwołać się do pliku i zapisać go w następujący sposób:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
Lub, gdy chcesz automatycznie wygenerować unikalną nazwę pliku, aby uniemożliwić użytkownikom nadpisywanie istniejących plików przypadkowo o tej samej nazwie:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
Jak uzyskać part
w JSP / Servlet znajduje się w artykule Jak przesłać pliki na serwer za pomocą JSP / Servlet? a odpowiedź na temat sposobu uzyskania part
w JSF znajduje się w artykule Jak przesłać plik za pomocą JSF 2.2 <h: inputFile>? Gdzie jest zapisany plik?
Uwaga: nie używaj, Part#write()
ponieważ interpretuje ścieżkę względem tymczasowego miejsca przechowywania zdefiniowanego w @MultipartConfig(location)
.
Zobacz też: