Contoh Memuat turun Fail dalam Servlet

1. Gambaran keseluruhan

Ciri umum aplikasi web adalah kemampuan memuat turun fail.

Dalam tutorial ini, kita akan membahas contoh mudah untuk membuat fail yang boleh dimuat turun dan melayannya dari aplikasi Java Servlet .

Fail yang kami gunakan akan berasal dari sumber webapp.

2. Pergantungan Maven

Sekiranya menggunakan Jakarta EE, maka kita tidak perlu menambahkan kebergantungan. Namun, jika kita menggunakan Java SE, kita memerlukan ketergantungan javax.servlet-api:

 javax.servlet javax.servlet-api 4.0.1 provided  

Versi ketergantungan terkini boleh didapati di sini.

3. Servlet

Mari lihat kodnya terlebih dahulu dan kemudian cari tahu apa yang berlaku:

@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 ("/ muat turun") menandakan kelas DownloadServlet untuk melayani permintaan yang diarahkan pada titik akhir "/ muat turun" .

Sebagai alternatif, kita boleh melakukan ini dengan menerangkan pemetaan dalam fail web.xml.

3.2. Jenis Kandungan Respons

The HttpServletResponse objek mempunyai kaedah yang disebut sebagai setContentType yang boleh kita gunakan untuk menetapkan Content-Type pengepala sambutan HTTP.

Content-Type adalah nama sejarah harta benda pengepala. Nama lain ialah jenis MIME (Sambungan Mel Internet Serbaguna). Kita sekarang hanya merujuk kepada 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 boleh didapati di sini .

Sebagai contoh, kami menggunakan fail teks ringkas. The Content-Type untuk fail teks "text / plain".

3.3. Kandungan Respons -Pelupusan

Menetapkan tajuk Content-Disposition pada objek respons memberitahu penyemak imbas bagaimana menangani fail yang diaksesnya.

Penyemak imbas memahami penggunaan Content-Disposition sebagai konvensyen tetapi sebenarnya bukan sebahagian daripada standard HTTP. W3 mempunyai memo mengenai penggunaan Content-Disposition yang boleh dibaca di sini.

Nilai Content-Disposition untuk badan utama respons adalah "sebaris" (untuk kandungan halaman web yang akan diberikan) atau "lampiran" (untuk fail yang dapat diunduh).

Sekiranya tidak dinyatakan, Lalai -Kandungan lalai adalah "sebaris".

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

Sebilangan penyemak imbas akan segera memuat turun fail menggunakan nama fail yang diberikan dan yang lain akan menunjukkan dialog muat turun yang mengandungi nilai yang telah kami tentukan.

Tindakan yang tepat akan bergantung pada penyemak imbas.

3.4. Membaca Dari Fail dan Menulis ke Output Stream

Pada baris kod yang tinggal, kami mengambil ServletContext dari permintaan, dan menggunakannya untuk mendapatkan fail di "/WEB-INF/sample.txt".

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

Ukuran susunan bait yang kami gunakan sewenang-wenangnya. Kami dapat menentukan ukuran berdasarkan jumlah memori yang wajar diperuntukkan untuk menyampaikan data dari InputStream ke OutputStream ; semakin kecil nuber, semakin banyak gelung; semakin besar bilangannya, semakin tinggi penggunaan memori.

Kitaran ini berterusan sehingga numByteRead 0 sebagai yang menunjukkan akhir fail.

3.5. Tutup dan Siram

Aliran aliran mesti ditutup selepas digunakan untuk melepaskan sumber yang ada pada masa ini. Contoh penulis juga mesti dibuang untuk menulis baki buffer yang tersisa ke tempat tujuannya.

Dengan menggunakan pernyataan cuba-dengan-sumber , aplikasi akan secara automatik menutup semua contoh AutoCloseable yang ditentukan sebagai sebahagian dari pernyataan cubaan . Baca lebih lanjut mengenai sumber daya mencuba di sini.

Kami menggunakan dua kaedah ini untuk melepaskan memori, memastikan bahawa data yang telah kami siapkan dihantar dari aplikasi kami.

3.6. Memuat turun Fail

Dengan semua yang ada, kami kini bersedia menjalankan Servlet kami.

Sekarang apabila kita mengunjungi titik akhir "/ muat turun" , penyemak imbas kita akan berusaha memuat turun fail sebagai "simple.txt".

4. Kesimpulan

Memuat turun fail dari Servlet menjadi proses yang mudah. Menggunakan aliran membolehkan kita menyampaikan data sebagai bait dan Jenis Media memberitahu penyemak imbas pelanggan jenis data yang diharapkan.

Itu adalah penyemak imbas untuk menentukan bagaimana menangani tindak balas, namun, kami dapat memberikan beberapa panduan dengan tajuk Content-Disposition .

Semua kod dalam artikel ini boleh didapati di GitHub.