Pertama mari kita lihat contoh pengunduhan file yang paling sederhana:
Copy kode kodenya sebagai berikut:
paket com.yyz.response;
impor java.io.FileInputStream;
impor java.io.IOException;
impor java.io.OutputStream;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServlet;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
//Pengunduhan berkas
kelas publik ResponseDemo memperluas HttpServlet {
public void doGet (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
String realpath = ini.getServletContext().getRealPath("/download/1.gif");
String nama file = realpath.substring(realpath.lastIndexOf("//")+1);
respon.setHeader("disposisi konten", "lampiran;namafile="+namafile);
//Server menggunakan header ini untuk memberitahu browser agar membuka data dalam mode download
FileInputStream di = FileInputStream baru(realpath);
int len = 0;
buffer byte[]=byte baru[1024];
OutputStream keluar = respon.getOutputStream();
while((len = masuk.baca(buffer))>0){
keluar.tulis(buffer, 0, len);
}
melampirkan();
//Tidak perlu menutupnya. Ketika respons dimusnahkan, server akan secara otomatis menutup aliran yang terkait dengan respons.
}
public void doPost (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
doGet(permintaan,tanggapan);
}
}
Fungsi kode ini adalah untuk mendownload gambar 1.png dari server. Struktur direktori ditampilkan sebagai berikut menggunakan penjelajah paket MyEclipse:
Mari kita buat sedikit lebih sulit. File yang ingin kita download adalah file dengan nama Cina. Karena yang ada di file header di protokol http hanya bisa berupa karakter ASCII, cara di atas (langsung ubah String realpath = this.getServletContext().getRealPath("/download/1.gif"); menjadi String realpath = this . getServletContext().getRealPath("/download/picture.gif");) Dapatkan file secara langsung,
Akan ada masalah kode yang kacau. Terlampir adalah hasil tesnya:
Untuk mengatasi masalah ini, gunakan metode encode dari kelas URLEncoder:
Copy kode kodenya sebagai berikut:
paket com.yyz.response;
impor java.io.FileInputStream;
impor java.io.IOException;
impor java.io.OutputStream;
impor java.net.URLEncoder;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServlet;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
//Saat mengunduh file berbahasa Mandarin, nama file berbahasa Mandarin harus dikodekan dengan URL.
kelas publik ResponseDemo memperluas HttpServlet {
public void doGet (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
String realpath = ini.getServletContext().getRealPath("/download/picture.gif");
String nama file = realpath.substring(realpath.lastIndexOf("//")+1);
respon.setHeader("disposisi konten", "lampiran;namafile="+URLEncoder.encode(namafile,"UTF-8"));
//Fungsi ini mengkodekan string ke dalam URL
FileInputStream di = FileInputStream baru(realpath);
int len = 0;
buffer byte[]=byte baru[1024];
OutputStream keluar = respon.getOutputStream();
while((len = masuk.baca(buffer))>0){
keluar.tulis(buffer, 0, len);
}
melampirkan();
}
public void doPost (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
doGet(permintaan,tanggapan);
}
}
Terlampir adalah hasil tesnya:
Selain itu, ada detail kecil yang perlu diperhatikan setiap orang:
FileReader tidak dapat digunakan sebagai pengganti FileInputStream. Data akan hilang saat menggunakan FileReader. Alasannya adalah ini: FileReader adalah aliran karakter, dan data seperti gambar dan file media disimpan dalam bentuk 01. Saat membaca dengan FileReader, Anda perlu melihat tabel pengkodean pengkodean tidak ditentukan, pengkodean default untuk platform terkait digunakan. Misalnya, komputer di China akan memeriksa GB2312. Ketika kode yang tidak ada pada tabel kode GB2312 dibaca, data akan dikodekan menjadi '? ', datanya akan menjadi bahasa China dan'? 'Mencampur. Setelah mengirimkannya ke klien, periksa kembali tabel kode saat menampilkannya, dan ganti semua kode '?' dengan '?', dan data akan hilang. Ingatlah satu hal tentang detail ini: aliran byte dapat menangani semua jenis data, aliran karakter hanya dapat menangani data karakter.