Saya membaca di sini bahwa seseorang tidak boleh menyimpan file di server karena tidak portabel, transaksional dan memerlukan parameter eksternal. Namun, mengingat bahwa saya memerlukan solusi tmp untuk tomcat (7) dan saya memiliki kontrol (relatif) atas mesin server yang ingin saya ketahui:
Di mana tempat terbaik untuk menyimpan file? Haruskah saya menyimpannya di
/WEB-INF/uploads
(disarankan agar tidak di sini ) atau di suatu tempat di bawah$CATALINA_BASE
(lihat di sini ) atau ...? Tutorial JavaEE 6 mendapatkan jalur dari pengguna (: wtf :). NB: File tidak boleh diunduh dengan cara apa pun.Haruskah saya menyiapkan parameter konfigurasi seperti yang dijelaskan di sini ? Saya akan menghargai beberapa kode (saya lebih suka memberikannya jalur relatif - jadi setidaknya ini portabel Tomcat) -
Part.write()
terlihat menjanjikan - tetapi tampaknya membutuhkan jalur absolutSaya akan tertarik pada eksposisi kerugian dari pendekatan ini vs database / repositori JCR
Sayangnya FileServlet oleh @BalusC berkonsentrasi pada mengunduh file, sementara jawabannya pada mengunggah file melompati bagian tempat menyimpan file.
Solusi yang mudah dikonversi untuk menggunakan implementasi DB atau JCR (seperti jackrabbit ) akan lebih disukai.
sumber
Jawaban:
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 :
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:
Variabel lingkungan melalui
SET UPLOAD_LOCATION=/path/to/uploads
:Argumen VM selama startup server melalui
-Dupload.location="/path/to/uploads"
:*.properties
entri file sebagaiupload.location=/path/to/uploads
:web.xml
<context-param>
dengan namaupload.location
dan nilai/path/to/uploads
:Jika ada, gunakan lokasi yang disediakan server, misalnya di JBoss AS / WildFly :
Apa pun itu, Anda dapat dengan mudah merujuk dan menyimpan file sebagai berikut:
Atau, jika Anda ingin membuat nama file unik secara otomatis untuk mencegah pengguna menimpa file yang ada dengan nama yang sama secara tidak sengaja:
Bagaimana cara mendapatkan
part
di JSP / Servlet dijawab di Bagaimana cara mengunggah file ke server menggunakan JSP / Servlet? dan cara mendapatkanpart
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:
sumber
@MultipartConfig(location)
Menentukan sementara lokasi storge yang server harus menggunakan ketika ukuran file melebihi ambang batas untuk penyimpanan memori, bukan lokasi penyimpanan permanen di mana Anda akan lebih akhirnya seperti itu untuk disimpan. Nilai ini secara default ke jalur seperti yang diidentifikasi olehjava.io.tmpdir
properti sistem. Lihat juga jawaban terkait ini untuk upaya JSF yang gagal: stackoverflow.com/questions/18478154/…Part.write
>> Ini memungkinkan implementasi tertentu untuk digunakan, misalnya, penggantian nama file, jika memungkinkan, daripada menyalin semua data yang mendasarinya, sehingga mendapatkan manfaat kinerja yang signifikan sehubungan dengan beberapa tidak diketahui metode "potong" (vs salin) dari mengatakan beberapa lib apache akan menyelamatkan saya dari kerumitan menulis byte sendiri - dan membuat ulang file yang sudah ada (lihat juga di sini )Part#write()
. Saya memperbarui jawabannya dengan itu."jboss.server.data.dir"
?Saya memposting cara terakhir saya melakukannya berdasarkan jawaban yang diterima:
dimana:
dan properti /WEB-INF/app.:
HTH dan jika Anda menemukan bug beri tahu saya
sumber