Ide Dasar:
Gagasan sebelumnya adalah memunculkan sebuah kotak untuk bertanya kepada pengguna di mana dia ingin menyimpan file, dan kemudian saya membuat file lain dan meletakkannya di sana. Namun, ide saya tidak berhasil.
Cara mengunduh file sangat mudah untuk mengklik tautan. Latar belakang mengeluarkan aliran file dan mewujudkan fungsi unduhan melalui browser, termasuk menanyakan tentang lokasi dan penyimpanan file. Sebagian besar browser akan mengkonfigurasi lokasi yang tetap, dan mungkin tidak bertanya setiap saat.
Front-end sangat sederhana, tag <a>, href = "alamat metode backend". Jika kebutuhan Anda tidak dapat digunakan secara langsung di hyperlink, Anda dapat menulisnya di JS
window.location.href = "alamat metode backend".
Setelah melompat ke metode latar belakang
String filePath = this.getClass (). GetClassLoader (). GetResource (""). Pouri (). GetPath () + "/Exportpdf.pdf"; // jalur file dalam file proyek outfile = file baru (filepath); String filename = outfile.getName (); // Dapatkan nama file inputStream fis = baru bufferedInputStream (FileInputStream baru (FilePath)); byte [] buffer = byte baru [fis.available ()]; fis.read (buffer); // Baca File Stream fis.close (); response.reset (); // Setel ulang hasil yang ditetapkan response.addheader ("Disposisi Konten", "Lampiran; FileName =" + String Baru (FileName.Replaceall ("", "") .getbytes ("UTF-8"), "iso8859-1"))); // kembalikan header file name response.addheader ("konten-panjang", "" + outfile.length ()); // kembalikan response ukuran file header.setContentType ("Application/Octet-stream"); // Atur tipe data // Dapatkan output return body outputStream os = baru bufferedOutputStream (response.getoutputStream ()); os.write (buffer); // file output os.flush (); os.close (); Browser akan secara langsung mengenali bentuk output file ini dan kotak dialog muncul.
Perhatikan bahwa metode ini harus disesuaikan di latar belakang menggunakan metode tautan. Tidak mungkin menggunakan metode AJAX dan XMLHTTPREQUEST. Dengan cara ini, aliran file yang dikembalikan akan dikembalikan ke fungsi panggilan balik metode. Tentu saja, jika Anda ingin mendapatkan file di JS, ini akan berhasil.
Contoh
paket cn.itcast.day06.web.servlet; impor java.io.ioException; impor java.io.inputStream; impor java.io.outputStream; import java.net.urlencoder; impor javax.servlet.servletcontext; import javax.servlet.servletException; impor javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.htpserveVer; DownloadserVlet kelas publik memperluas httpservlet {public void doGet (httpservletRequest, httpservletResponse response) melempar servletException, ioException {// mengimplementasikan fungsi rantai anti-Theft // Get the Referer Header untuk menjelaskan di mana pengunjung datang dari string referer = request. if (referer == null ||! Referer.startswith ("http: // localhost")) {// Ini adalah tautan pencuri respons.sendredirect ("/day06/index.jsp"); kembali ; } // Pecahkan masalah respons respons respons Cina yang kacau.setContentType ("Teks/html; charset = utf-8"); // Atur pengkodean badan pesan // header pesan respons HTTP yang dikirim melalui protokol HTTP tidak dapat muncul dalam bahasa Cina Cina, Cina harus menjadi string filename yang dikodekan URL = urlencoder.encode ("Beauty.jpg", "UTF-8"); // beri tahu browser untuk membaca respons sumber daya. // Baca data gambar dan kirimkan ke IE Browser String WebPath = "/Download/Beauty.jpg"; // setara dengan jalur aplikasi web saat ini ServletContext servletContext = super.getSerVletContext (); InputStream in = servletContext.getResourceAsstream (webpath); OutputStream out = response.getoutputStream (); int len; byte [] buffer = byte baru [1024]; while ((len = in.read (buffer))! =-1) out.write (buffer, 0, len); } public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {doGet (permintaan, respons); }}