Tout d'abord, permettez-moi de présenter les technologies pertinentes:
Deux paramètres importants dans la méthode de service.
ServLetRequest l'utilise pour recevoir des demandes d'utilisateur, et sa fonction est:
Un de ses sous-interfaces: javax.servlet.http.httpservletRequest
ServletResponse est utilisé pour renvoyer des données à l'utilisateur.
Un de ses sous-interfaces: javax.servlet.http.httpservletResponse
Technologie de téléchargement de fichiers:
La technologie de téléchargement de fichiers est relativement simple pour la technologie de téléchargement de fichiers. Prenons le téléchargement des photos à titre d'exemple:
Parcourez d'abord les photos, puis téléchargez-les
1. Code frontal:
<span style = "font-size: 14px;"> <a href = "img"> trouvez toutes les images sous le dossier </a> <br/> </span>
La réception peut être effectuée en une seule phrase. Recherchez directement les programmes de fond via web.xml
2. Code d'affichage d'arrière-plan:
<span style = "font-size: 14px;"> public class showImg étend httpServlet {public void doGet (httpservletRequest request, httpservletResponse réponse) t servletException, ioException {<span style = "white-space: pre"> </span> DOPOST (demande, réponse); // pour éviter les exceptions, connectez Doget et DoPost ensemble} </span> <span style = "font-size: 14px;"> public void doPost (HttpServletRequest Request, htt PServletResponse Response) lance ServletException, IoException {request.Setcharacterencoding ("utf-8"); "> <span style =" font-size: 14px; "> // <span style =" white-space: pre "> </span> appelez le servletContext, bien sûr, vous pouvez également l'appeler directement --- Lorsqu'il est répertorié un par un, le chemin absolu vers le fichier est requis lorsque l'image est utilisée </span> ServletContext context = getServletContext (); String path = context.getRealPath ("/ imgs"); // Trouvez le chemin absolu du fichier de dossier = nouveau fichier (path); <span style = "font-s ize: 14px; "> // <span style =" White-Space: pre "> </span> Après avoir trouvé le dossier, répertoriez toutes les images pour que les utilisateurs puissent parcourir les fichiers de chaîne [] = file.list (); for (String fn: fichiers) {</span> <pren name = "code"> <span style = "font-size: 14px;"> // les affichent tous </span> String img = "<img src = 'imgs /" + fn + "' />";
// out.print ("<a href = imgs / '" + fn + "'> télécharger l'image </a>"); string str = "<a href = 'down? name = imgs /" + fn + "'> Téléchargez l'image </a> "; // Fournir le téléchargement hyperlien, passez le paramètre --- transférer le nom de fichier au contenu du lien utilisateur et écrire.print (str); out.print (img +" <br/> ");}}
3. Téléchargement spécifique de fichiers
Tout d'abord, le protocole correspondant doit être défini. Le protocole de téléchargement nécessite de définir l'en-tête de téléchargement correspondant
<span style = "blanc-espace: pre"> </span> <span style = "font-size: 18px;"> <strong> réponse.setContentType ("Application / Force-Download" </strong>); / / Définissez l'en-tête correspondant </span> Lors du téléchargement, vous devez afficher le nom de fichier de l'image actuelle.
<span style = "font-size: 18px;"> <span style = "white-espace: pre"> </span> outputStream out = réponse.getOutputStream (); // Obtenez le stream de sortie nom de chaîne = reque st. getParameter ("name"); // Le nom du paramètre passé à partir du service client est int num = name.lastIndexof ("/"); string aa = name.substring (num + 1); "UTF- 8"); // Si le chinois doit être recodé // System.out.println (aa); Strong> attachement; Faire un téléchargement spécifique
<span style = "font-size: 18px;"> string filename = this.getServletContext (). getRealPath (name); // Obtenez le chemin absolu, passez le nom du fichier et en même temps, passez le chemin absolu que peut être obtenu et vous pouvez lire ITTO-BURET dans = new FileInputStream (nom de fichier); {out.write (b, 0, len);} </span> Image de reproduction:
Le rendu après avoir cliqué:
Le nom du fichier est différent
Technologie de téléchargement de fichiers
Il sera très difficile de télécharger vous-même des fichiers, afin que nous puissions utiliser le package de quelqu'un d'autre pour télécharger le lien et cliquer pour ouvrir le formulaire de lien:
Le client doit utiliser le type de données multipart / formulaire de format pour représenter le type de données composite lors de l'envoi de HTTP.
C'est-à-dire: <formulaire enctype = "multipart / form-data">
Utilisez la balise <input type = "file" name = "SomeName" /> html dans le formulaire.
Package requis:
Commons-fileupload.jar, l'outil de téléchargement de fichiers de base se trouve dans ce package.
Package Commons-io.jar requis pour télécharger des fichiers
Explication détaillée:
DiskFileItemFactory - Créez un répertoire de fichiers de surveillance dans le temps, qui fait référence à la taille de la zone de cache
ServletFileUpload est utilisé pour analyser httpServleRequest. Renvoie un ensemble d'objets de fichier.
FileItem représente chaque objet de fichier téléchargé par l'utilisateur.
Processus principal:
Fichier f = nouveau fichier ("f: / ex / temp"); // spécifiez l'emplacement temporaire de stockage de fichiers
DiskfileItemfactory ff = new DiskFileItemFactory (1024 * 1024 * 5, f); // la taille et l'emplacement de stockage des fichiers temporaires
ServletFileUpload sf = new ServletFileUpload (FF);
List <FequeItem> list = sf.parsErequest (demande); // Démarrer l'analyse
for (fileItem it: list) {// Obtenez le nom du fichier. Et utiliser UUID pour résoudre le problème des noms en double
FileUtils.copyInputStreamtoFile (it.getInputStream (), nouveau fichier (path + "/" + nom de fichier)); // dans le dossier spécifié écrit
}
1. Code de réception:
<span style = "font-size: 18px;"> <h2> télécharger le fichier </h2> <form action = "upfile" méthode = "post" <span style = "colori: # ff0000;"> enctype = "multipart / form-data "</span>> // il doit être écrit, sinon la station ne peut pas recevoir de données <! - CetType =" multipart / form-data "---> file1 <entrée type =" file "< Span Style = "Color: # ff6666;"> name </span> = "file" /> <br/> Veuillez saisir un nom: <input type = "text" <span style = "Color: # ff6666;"> nom </span> = "desc" /> <br/> file2 <input type = "file" <span style = "colori: # ff6666;"> name </span> = "file" /> <br/> Veuillez saisir un nom: <input type = "text" <span style = "Color: # ff0000;"> name </span> = "desc" /> <br/> <input type = "soumi" value = "soumettre "/> </ form> </span>
2. Code d'arrière-plan:
2-1 Créez d'abord une usine à disque dur pour stocker des fichiers temporaires
//Specify the temporary storage location File f = new File("F:/ex/temp");//Specify the temporary storage location DiskFileItemFactory ff = new DiskFileItemFactory(1024*1024*5, f);//Size of the Emplacement temporaire de fichiers et de stockage2-2 Créez un objet ServletFileUpload et définissez la taille du fichier pour maximiser le transfert de fichier
// Créer un objet pour l'analyse de servletFileUpload sf = new ServletFileUpload (ff); * 20);
2-3 Démarrer l'analyse de l'objet
<span style = "White-Space: Pre"> </ span> list <FichierItem> list = sf.parsErequest (request); // Obtenez toutes les informations transmises à partir de la réception, la réception doit remplir ENCTYPE = "Multipart / form- data "for (fileItem it: list) {it0 = it; // <span style =" white-space: pre "> </span> s'il s'agit d'un objet de formulaire normal - vous pouvez directement juger si ( it.isformField ()) {// Il s'agit d'un élément de formulaire normal, tel que Type = Nom de texte Nom de chaîne = it.getString ("utf-8"); + name); // ci-dessous le nom de l'explication écrite} else {<span style = "white-espace: pre"> </span> // c'est le nom de fichier sélectionné par la chaîne de reprise name = it.getName (); // le chemin de fichier spécifique-- -Absolute Path // String str = it.getString (); // Contenu dans le fichier // System.out.println ("str" + str); .getContentType (); Long Size = it.getSiz e (); <pren name = "code" style = "Font- taille: 18px;"> // <span style = "white-space: pre"> </span> Le nom de fichier de ressource du côté du serveur ne peut pas être en chinois, le Le navigateur le codera automatiquement --------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------ Le nom du fichier téléchargé est converti en nom sans stockage chinois. Le nom de mappage doit être stocké, puis converti lorsque l'utilisateur télécharge. // La chaîne de nom de carte id = uUid.randomuuid (). ToString (). Remplace ("-", ""); // seul UUID du monde est utilisé pour // Nom de fichier String LastName = name.substring (Name. LastIndexof (".")); // Format de fichier // Les formats de fichiers de nom sont tous trouvés --- String combinant fileName = id + lastName; // new File Name // Copy Stream. Laissez-le écrire à l'emplacement correspondant FileUtils.copyInputStreamtoFile (it.getInputStream (), nouveau fichier (chemin + "/" + nom de fichier)); // le chemin est le chemin absolu du stockage - défini précédent}
Cela peut réaliser des téléchargements simples, mais ce type de téléchargement n'est pas du tout sûr. Le code complet est joint avec des problèmes mineurs pour éviter les problèmes généraux.
Après avoir sélectionné le fichier
Vérifiez les fichiers du serveur Web IMG, le fichier a été téléchargé sur la page "Nom de fichier généré par UUID"
Fichier Téléchargez le code source:
<Span Style = "Font-Size: 14PX;" Pack Java .Util.List; .apache .commons.FileUpload.FileItem; apache.commons .io.fileUtils; public class MyupFile étend httpServlet {<span style = "white-space: pre;"> </span> // doget empêche les gens de saisir les adresses dans la colonne d'utilisateurs. No Response <Span Style = "White-Space: Pre;"> </span> @Override <Span Style = "White-Space: Pre;"> </span> Protected void Doget (httpservletRequest req, Http ServletResponse resp) < Span Style = "White-Space: Pre;"> </ Span> lance ServletException, ioException {<span style = "White-Space: pre;"> </span> resp.setContentType ("UTF-8"); Span Style = "White-Space: Pre;"> </span> écrivain wr = resp.getwriter (); Méthode prise en charge mais téléchargement "); <span style =" blanc-espace: pre; "> </span>} <span style =" White-Space: pre; "> </span> <span style =" White-Space : pre; "> </span> public void doPost (requette httpServletRequest, httpservletResponse réponse) <span style =" white-space: pre; "> </span> lance servlexception, ioException {<span style =" white-space: pré; "> </span> "); <span style =" White-Space: pre; "> </span> printwriter out = réponse.getWriter (); <span style =" White-Space: pre; "> </span> // Protéger à Formulaires normaux Méthode de téléchargement 1: <span style = "White-Space: pre;"> </span> // RETOUR VALUE GET (NULL) POST1 (apLlication / X-Form-Urlencoded, formulaire normal) post2 (fichier: multipart / form- data, formulaire de téléchargement de fichiers) // <span style = "white-space: pre;"> </ span> string type = request.getContentType (); > </pan>if(!Type.contsans("mulitPart/form-data ")) {// <span style =" White-espace: pre; "> </span> out.write (" ne prend pas en charge le téléchargement des formulaires normaux 2 "); // <span style =" blanc-espace: pre; "> </span> return; // <span style =" white-space: pre; "> </span>} <span Style = "White-Space: Pre;"> </ span> // Méthode 2 <Span Style = "White-Space: Pre;"> </span> Boolean Boo = ServletFileUpload.ismulTipartContent (demande); "White- espace: pre;"> </span> if (boo == false) {<span style = "white-espace: pre;"> </span> out.print ("télécharger 1 des formulaires normaux n'est pas Prise en charge "); <span style =" White-Space: pre; "> </span> <span style =" White-Space: pre; "> </span>} <span style =" White-Space: Pre; "> </span>} span> <span style =" White-Space: pre; "> </span> // spécifiez l'emplacement de stockage temporaire <Span Style =" White-Space: Pre; "> </span> Fichier f = nouveau fichier ("f: / ex / temp"); // spécifiez l'emplacement de stockage de fichiers temporaire <span style = "white-space: pre;"> </span> diskfileitemfactory ff = new diskfileitemfactory (1024 * 1024 * 5, f); // Taille du fichier temporaire et emplacement de stockage <Span Style = "White-Space: Pre;"> </span> <span style = "White-Space: Pre;"> </span> // Créer Un objet pour l'analyse <span style = "White-Space: pre;"> </span> servletFileUpload sf = new ServletFileUpload (ff); (1024 * 1024 * 10); // La valeur maximale d'un seul emplacement de stockage est de 10m <span style = "White-Space: pre;"> </span> sf.setsizemax (1024 * 1024 * 20); / / La valeur maximale de tous les fichiers est de 20m <span style = "White-Space: Pre;"> </span> String Path = this.getServletContext (). GetRealPath ("/ imgs"); Espace: pre; "> </span> System.out.println (" Chemin de stockage: "+ chemin); <span style =" White-Space: Pre; "> </span> // Démarrer l'analyse <Span Style = "White-Space: pre;" " "White-Space: pre;"> </span> list <FichierItem> list = sf.parsErequest (request); // obtenez toutes les informations transmises à partir de la réception, la réception doit remplir ENCTYPE = "Multipart / Form- data "<span style =" white- espace: pre; "> </span> pour (fileItem it: list) {<span style =" white-espace: pre; "> </span> it0 = it; <span style = "blanc-espace: pre;"> </span> if (it.isformField ()) {// est un élément de formulaire normal, tel que type = valeur texte de name <span style = "white-espace: pre ; "> </span> string name = it.getString (" utf-8 "); <span style =" white-space: pre; "> </span> System.out.println (" Nom de l'élément de formulaire de base: "+ name); // Écrit ci-dessous le nom de l'explication est <span style =" white-space: pre; "> </span>} else {<span style =" white-space: pre; "> </ Span> String name = it.getName (); / / Spécifique Path de fichier // <span style = "White-Space: Pre;"> </ span> String n1 = it.getFieldName (); "White-Space: pre;"> </span> String str = it.getString (); // Le contenu du fichier // <span style = "White-Space: Pre;"> </span> Système. out.println ("str" + str); -space: pre; "> </span> string contentType = it.getContentType (); <span style =" white-espace: pre; "> </span> long size = it.getSize (); <span style = "White-espace: pre;"> </span> // Empêche le fichier de vide <span style = "White-Space: pre;"> </span> if (size == 0) {<span style = " Espace blanc: pre; "> </ span> continue; // le fichier est vide, retourne directement; <span style =" White-Space: pre; "> </span>} <span style =" White-Space : pré; "> </span> // Nom d'utilisateur. Vous devez remplir <span style = "blanc-espace: pre;"> </span> if (name == null || name.trim () == "") {<span style = "White-space: pre ; "White-Space: pre;"> </ span> System.out.println (nom + "," + contentType + "," + size); / Le nom du fichier de ressources du côté du serveur ne peut pas être en chinois, le navigateur le codera automatiquement ------------------------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------> </span> // Afin de permettre aux utilisateurs de restaurer leur nom d'origine lors du téléchargement, ils doivent stocker la correspondance entre le nom du fichier d'origine et le nom de mappage, et le convertir lorsque l'utilisateur télécharge. pré; "> </span> // Nom de mappage <span style =" blanc-espace: pre; "> </span> string id = uuid.randomuuid (). toString (). Remplace (" - "," " ); (".")); </span> String filename = id + lastName; <span style = "White-Space: pre;"> </span> // Copier Stream. Laissez-le écrire à l'emplacement correspondant <span style = "blanc-espace: pre;"> </span> fileUtils.copyInputStreamtoFile (it.getInputStream (), nouveau fichier (path + "/" + nom de fichier));} <Span Style = "White-Space: pre;"> </span>}} catch (fileupLoadexception e) {<span style = "white-space: pre;"> </span> lancez new RuntimeException ("File Téléchargez l'erreur d'analyse." + e); <span style = "White-Space: pre;"> </span>} enfin {<span style = "White-Space: pre;"> </span> if (it0 == null) {< span style = "White-Space: pre;"> </span> it0.delete (); // supprimer le fichier temporaire <span style = "White-Space: pre;"> </span>}} out.close ( . CN .hncU.DedImg; Mercysit bas. Réponse de réponse) lance ServletExcepti sur, ioException {doPost (demande, réponse); Envoyez le nom d'utilisateur à la réception / * Transférer la chaîne de nom d'utilisateur fixe aa = "1.jpg"; // Si elle est en chinois, vous devez coder aa = urlencoder.encode (aa, "utf-8"); Response.SetHeader ("Content-Disposition", "Pixe; FileName = '" + aa + "'"); ///// Vous devez ajouter "Pièce jointe;", sinon il deviendra une navigation * / OutputStream Out = Response. GetOutputStream (); // Obtenez le flux de sortie Nom = Request. substring (num + 1); aa = urlencoder.encode (aa, "utf-8"); // s'il est nécessaire de recoder dans chinois // system.out.println (aa); Disposition "," pièce jointe; filename = '"+ aa +"' "); // obtenez le nom de fichier passé à partir de là afin qu'il puisse être téléchargé lors du stockage de chaîne filename = this.getServletContext (). GetRealPath (name); // Obtenez le chemin absolu InputStream dans = new FileInputStream (nom de fichier); write (b, 0, len);}}} </span> <span style = "font-size: 18px;"> </span>Ce qui précède concerne cet article, j'espère qu'il sera utile à l'apprentissage de tout le monde.