Examinons d’abord l’exemple le plus simple de téléchargement de fichier :
Copiez le code comme suit :
paquet com.yyz.response ;
importer java.io.FileInputStream ;
importer java.io.IOException ;
importer java.io.OutputStream ;
importer javax.servlet.ServletException ;
importer javax.servlet.http.HttpServlet ;
importer javax.servlet.http.HttpServletRequest ;
importer javax.servlet.http.HttpServletResponse ;
//Téléchargement du fichier
la classe publique ResponseDemo étend HttpServlet {
public void doGet (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
String realpath = this.getServletContext().getRealPath("/download/1.gif");
String filename = realpath.substring(realpath.lastIndexOf("//")+1);
réponse.setHeader("content-disposition", "attachment;filename="+filename);
//Le serveur utilise cet en-tête pour indiquer au navigateur d'ouvrir les données en mode téléchargement
FileInputStream in = new FileInputStream(realpath);
int len = 0;
tampon d'octets[]=nouvel octet[1024] ;
OutputStream out = réponse.getOutputStream();
while((len = in.read(buffer))>0){
out.write(tampon, 0, len);
}
joindre();
//Il n'est pas nécessaire de fermer. Lorsque la réponse est détruite, le serveur fermera automatiquement le flux lié à la réponse.
}
public void doPost (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
doGet (demande, réponse);
}
}
La fonction de ce code est de télécharger l'image 1.png depuis le serveur. La structure des répertoires est affichée comme suit à l'aide de l'explorateur de packages de MyEclipse :
Rendons les choses un peu plus difficiles. Le fichier que nous voulons télécharger est un fichier avec un nom chinois. Étant donné que les éléments du fichier d'en-tête du protocole http ne peuvent être que des caractères ASCII, la méthode ci-dessus (change directement String realpath = this.getServletContext().getRealPath("/download/1.gif"); en String realpath = this . getServletContext().getRealPath("/download/picture.gif");) Récupérez le fichier directement,
Il y aura des problèmes de code tronqué. Ci-joint les résultats des tests :
Pour résoudre ce problème, utilisez la méthode encode de la classe URLEncoder :
Copiez le code comme suit :
paquet com.yyz.response ;
importer java.io.FileInputStream ;
importer java.io.IOException ;
importer java.io.OutputStream ;
importer java.net.URLEncoder ;
importer javax.servlet.ServletException ;
importer javax.servlet.http.HttpServlet ;
importer javax.servlet.http.HttpServletRequest ;
importer javax.servlet.http.HttpServletResponse ;
//Lors du téléchargement de fichiers chinois, les noms de fichiers chinois doivent être codés en URL.
la classe publique ResponseDemo étend HttpServlet {
public void doGet (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
String realpath = this.getServletContext().getRealPath("/download/picture.gif");
String filename = realpath.substring(realpath.lastIndexOf("//")+1);
réponse.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
//Cette fonction encode la chaîne en URL
FileInputStream in = new FileInputStream(realpath);
int len = 0;
tampon d'octets[]=nouvel octet[1024] ;
OutputStream out = réponse.getOutputStream();
while((len = in.read(buffer))>0){
out.write(tampon, 0, len);
}
joindre();
}
public void doPost (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
doGet (demande, réponse);
}
}
Ci-joint les résultats des tests :
De plus, il y a un petit détail auquel chacun doit prêter attention :
FileReader ne peut pas être utilisé à la place de FileInputStream. Les données seront perdues lors de l'utilisation de FileReader. La raison est la suivante : FileReader est un flux de caractères et les données telles que les images et les fichiers multimédias sont stockées sous la forme 01. Lors de la lecture avec FileReader, vous devez consulter une table de codage. l'encodage n'est pas spécifié, l'encodage par défaut de la plateforme correspondante est utilisé. Par exemple, les ordinateurs en Chine vérifieront GB2312. Lorsqu'un code qui n'existe pas dans la table de codes GB2312 est lu, les données seront codées dans '? ', les données deviendront chinoises et '? 'Mélanger. Après l'avoir envoyé au client, vérifiez à nouveau la table de codes lors de son affichage et remplacez tous les codes « ? » par « ? » et les données seront perdues. N'oubliez pas une chose à propos de ce détail : les flux d'octets peuvent gérer n'importe quel type de données, les flux de caractères ne peuvent gérer que les données de caractères.