Schauen wir uns zunächst das einfachste Beispiel eines Dateidownloads an:
Kopieren Sie den Codecode wie folgt:
Paket com.yyz.response;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//Datei herunterladen
öffentliche Klasse ResponseDemo erweitert HttpServlet {
public void doGet(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
String realpath = this.getServletContext().getRealPath("/download/1.gif");
String filename = realpath.substring(realpath.lastIndexOf("//")+1);
Response.setHeader("content-disposition", "attachment;filename="+filename);
//Der Server verwendet diesen Header, um den Browser anzuweisen, die Daten im Download-Modus zu öffnen
FileInputStream in = new FileInputStream(realpath);
int len = 0;
Bytepuffer[]=neues Byte[1024];
OutputStream out = Response.getOutputStream();
while((len = in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
//Es besteht keine Notwendigkeit, die Antwort zu schließen. Der Server schließt automatisch den Stream, der sich auf die Antwort bezieht.
}
public void doPost(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
doGet(Anfrage,Antwort);
}
}
Die Funktion dieses Codes besteht darin, Bild 1.png vom Server herunterzuladen. Die Verzeichnisstruktur wird mit dem Paket-Explorer von MyEclipse wie folgt angezeigt:
Machen wir es etwas schwieriger. Die Datei, die wir herunterladen möchten, ist eine Datei mit einem chinesischen Namen. Da die Dinge in der Header-Datei im http-Protokoll nur ASCII-Zeichen sein können, ändert die obige Methode String realpath = this.getServletContext().getRealPath("/download/1.gif"); direkt in String realpath = this. getServletContext().getRealPath("/download/picture.gif");) Holen Sie sich die Datei direkt,
Es wird Probleme mit verstümmeltem Code geben. Anbei die Testergebnisse:
Um dieses Problem zu lösen, verwenden Sie die Encode-Methode der URLEncoder-Klasse:
Kopieren Sie den Codecode wie folgt:
Paket com.yyz.response;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//Beim Herunterladen chinesischer Dateien müssen die chinesischen Dateinamen URL-codiert sein.
öffentliche Klasse ResponseDemo erweitert HttpServlet {
public void doGet(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
String realpath = this.getServletContext().getRealPath("/download/picture.gif");
String filename = realpath.substring(realpath.lastIndexOf("//")+1);
Response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
//Diese Funktion kodiert die Zeichenfolge in eine URL
FileInputStream in = new FileInputStream(realpath);
int len = 0;
Bytepuffer[]=neues Byte[1024];
OutputStream out = Response.getOutputStream();
while((len = in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
}
public void doPost(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
doGet(Anfrage,Antwort);
}
}
Anbei die Testergebnisse:
Darüber hinaus gibt es ein kleines Detail, auf das jeder achten sollte:
FileReader kann nicht anstelle von FileInputStream verwendet werden. Bei der Verwendung von FileReader gehen Daten verloren. FileReader ist ein Zeichenstrom und Daten wie Bilder und Mediendateien werden in der Form 01 gespeichert. Beim Lesen mit FileReader müssen Sie eine Codierungstabelle konsultieren Kodierung ist nicht angegeben. Es wird die Standardkodierung für die entsprechende Plattform verwendet. Beispielsweise prüfen Computer in China GB2312. Wenn ein Code gelesen wird, der nicht in der GB2312-Codetabelle vorhanden ist, werden die Daten in „?“ codiert. ', die Daten werden chinesisch und '? 'Mischen. Überprüfen Sie nach dem Senden an den Client die Codetabelle erneut und ersetzen Sie alle „?“-Codes. Die Daten gehen dann verloren. Denken Sie bei diesem Detail an eines: Byteströme können jede Art von Daten verarbeiten, Zeichenströme können nur Zeichendaten verarbeiten.