Simpan di mana saja di lokasi yang dapat diakses kecuali folder proyek IDE alias folder penerapan server, karena alasan yang disebutkan dalam jawaban untuk Gambar yang diunggah hanya tersedia setelah menyegarkan halaman :
Perubahan dalam folder proyek IDE tidak langsung terlihat di folder kerja server. Ada semacam pekerjaan latar belakang di IDE yang mengatur agar folder kerja server disinkronkan dengan pembaruan terakhir (ini dalam istilah IDE disebut "penerbitan"). Ini adalah penyebab utama masalah yang Anda lihat.
Dalam kode dunia nyata ada keadaan di mana menyimpan file yang diunggah di folder penerapan aplikasi web tidak akan berfungsi sama sekali. Beberapa server (baik secara default atau dengan konfigurasi) tidak memperluas file WAR yang diterapkan ke dalam sistem file disk lokal, melainkan sepenuhnya di memori. Anda tidak dapat membuat file baru di memori tanpa mengedit file WAR yang diterapkan dan menerapkannya kembali.
Bahkan saat server memperluas file WAR yang diterapkan ke sistem file disk lokal, semua file yang baru dibuat akan hilang saat penerapan ulang atau bahkan restart sederhana, hanya karena file baru tersebut bukan bagian dari file WAR asli.
Itu benar-benar tidak peduli dengan saya atau orang lain di mana tepatnya pada sistem file disk lokal itu akan disimpan, selama Anda tidak tidak pernah menggunakan getRealPath()
metode . Menggunakan metode itu bagaimanapun juga mengkhawatirkan.
Jalan menuju lokasi penyimpanan pada gilirannya dapat ditentukan dengan berbagai cara. Anda harus melakukan semuanya sendiri . Mungkin di sinilah kebingungan Anda disebabkan karena Anda entah bagaimana berharap server melakukan itu semua secara otomatis. Harap dicatat bahwa @MultipartConfig(location)
tidak tidak menentukan tujuan meng-upload akhir, tapi lokasi penyimpanan sementara untuk ukuran berkas kasus melebihi ambang batas penyimpanan memori.
Jadi, jalur ke lokasi penyimpanan akhir dapat ditentukan dengan salah satu cara berikut:
Hardcode:
File uploads = new File("/path/to/uploads");
Variabel lingkungan melalui SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
Argumen VM selama startup server melalui -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
entri file sebagai upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
dengan nama upload.location
dan nilai /path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
Jika ada, gunakan lokasi yang disediakan server, misalnya di JBoss AS / WildFly :
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
Apa pun itu, Anda dapat dengan mudah merujuk dan menyimpan file sebagai berikut:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
Atau, jika Anda ingin membuat nama file unik secara otomatis untuk mencegah pengguna menimpa file yang ada dengan nama yang sama secara tidak sengaja:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
Bagaimana cara mendapatkan part
di JSP / Servlet dijawab di Bagaimana cara mengunggah file ke server menggunakan JSP / Servlet? dan cara mendapatkan part
di JSF dijawab di Cara mengupload file menggunakan JSF 2.2 <h: inputFile>? Di mana File yang disimpan?
Catatan: jangan tidak menggunakan Part#write()
karena menafsirkan path relatif ke lokasi penyimpanan sementara didefinisikan dalam @MultipartConfig(location)
.
Lihat juga: