Contoh Mendownload File di Servlet

1. Ikhtisar

Fitur umum aplikasi web adalah kemampuan untuk mengunduh file.

Dalam tutorial ini, kami akan membahas contoh sederhana membuat file yang dapat diunduh dan menyajikannya dari aplikasi Java Servlet .

File yang kami gunakan akan berasal dari sumber webapp.

2. Ketergantungan Maven

Jika menggunakan Jakarta EE, maka kita tidak perlu menambahkan dependensi apa pun. Namun, jika kita menggunakan Java SE, kita membutuhkan dependensi javax.servlet-api:

 javax.servlet javax.servlet-api 4.0.1 provided  

Versi terbaru dari ketergantungan tersebut dapat ditemukan di sini.

3. Servlet

Mari kita lihat kodenya terlebih dahulu dan kemudian cari tahu apa yang terjadi:

@WebServlet("/download") public class DownloadServlet extends HttpServlet { private final int ARBITARY_SIZE = 1048; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/plain"); resp.setHeader("Content-disposition", "attachment; filename=sample.txt"); try(InputStream in = req.getServletContext().getResourceAsStream("/WEB-INF/sample.txt"); OutputStream out = resp.getOutputStream()) { byte[] buffer = new byte[ARBITARY_SIZE]; int numBytesRead; while ((numBytesRead = in.read(buffer)) > 0) { out.write(buffer, 0, numBytesRead); } } } }

3.1. Minta Titik Akhir

Anotasi @WebServlet ("/ download") menandai kelas DownloadServlet untuk melayani permintaan yang diarahkan ke titik akhir "/ download" .

Atau, kita dapat melakukan ini dengan mendeskripsikan pemetaan di file web.xml.

3.2. Jenis Konten Respons

The HttpServletResponse objek memiliki metode yang disebut sebagai setContentType yang dapat kita gunakan untuk mengatur Content-Type header respon HTTP.

Content-Type adalah nama historis dari properti header. Nama lain adalah tipe MIME (Multipurpose Internet Mail Extensions). Kami sekarang hanya merujuk ke nilai sebagai Jenis Media.

Nilai ini bisa berupa "application / pdf", "text / plain", "text / html", "image / jpg", dll. , Daftar resmi dikelola oleh Internet Assigned Numbers Authority (IANA) dan dapat ditemukan di sini .

Untuk contoh kami, kami menggunakan file teks sederhana. Jenis Konten untuk file teks adalah "teks / biasa".

3.3. Respon Isi-Disposisi

Menyetel header Content-Disposition di objek respons memberi tahu browser cara menangani file yang sedang diaksesnya.

Browser memahami penggunaan Content-Disposition sebagai konvensi tetapi sebenarnya bukan bagian dari standar HTTP. W3 memiliki memo tentang penggunaan Content-Disposition yang tersedia untuk dibaca di sini.

Nilai - nilai Disposisi Konten untuk isi utama tanggapan akan berupa "sebaris" (untuk konten laman web yang akan dirender) atau "lampiran" (untuk file yang dapat diunduh).

Jika tidak ditentukan, Content-Disposition default adalah "inline".

Dengan menggunakan parameter header opsional, kita dapat menentukan nama file "sample.txt".

Beberapa browser akan segera mengunduh file menggunakan nama file yang diberikan dan yang lain akan menampilkan dialog unduhan yang berisi nilai yang telah ditentukan sebelumnya.

Tindakan tepat yang diambil akan bergantung pada browser.

3.4. Membaca Dari File dan Menulis ke Arus Output

Di baris kode yang tersisa, kami mengambil ServletContext dari permintaan, dan menggunakannya untuk mendapatkan file di "/WEB-INF/sample.txt".

Dengan menggunakan HttpServletResponse # getOutputStream () , kita kemudian membaca dari aliran input sumber daya dan menulis ke OutputStream respons .

Ukuran array byte yang kami gunakan berubah-ubah. Kita dapat memutuskan ukuran berdasarkan jumlah memori yang masuk akal untuk dialokasikan untuk meneruskan data dari InputStream ke OutputStream ; semakin kecil nuber, semakin banyak loop; semakin besar angkanya, semakin tinggi penggunaan memori.

Siklus ini berlanjut hingga numByteRead bernilai 0 karena menunjukkan akhir file.

3.5. Tutup dan Siram

Stream instances must be closed after use to release any resources it is currently holding. Writer instances must also be flushed to write any remaining buffered bytes to it's destination.

Using a try-with-resources statement, the application will automatically close any AutoCloseable instance defined as part of the try statement. Read more about try-with-resources here.

We use these two methods to release memory, ensuring that the data we have prepared is sent out from our application.

3.6. Downloading the File

With everything in place, we are now ready to run our Servlet.

Sekarang ketika kita mengunjungi titik akhir relatif "/ download" , browser kita akan mencoba mendownload file sebagai "simple.txt".

4. Kesimpulan

Mengunduh file dari Servlet menjadi proses yang sederhana. Menggunakan aliran memungkinkan kami untuk membagikan data sebagai byte dan Jenis Media memberi tahu browser klien jenis data apa yang diharapkan.

Ini tergantung pada browser untuk menentukan bagaimana menangani respon, namun, kami dapat memberikan beberapa panduan dengan header Content-Disposition .

Semua kode dalam artikel ini dapat ditemukan di GitHub.