Dans le développement du système d'applications Web, les fonctions de téléchargement de fichiers et de téléchargement sont des fonctions très couramment utilisées. Aujourd'hui, parlons de l'implémentation des fonctions de téléchargement et de téléchargement de fichiers dans Javaweb.
1. Téléchargez un exemple simple
Jsp
<% @ Page Language = "Java" Import = "Java.util. *" Pageencoding = "UTF-8"%> <! DocType Html public "- // w3c // dtd xhtml 1.0 transitional // en"> <html> <adread> <méta http-equive = "contenu-type" content = "text / html; charset = utf-8 "/> <ititle> téléchargement de fichiers et téléchargement </title> </ head> <body> <form action =" $ {pageContext.Request.ContextPath} / uploadServlet "EncType =" multipart / form-data "méthode =" Post "> user: <entrée type =" text "name =" userName "/> <br / br / up up 1: <powny type =" username "/> <br / br / up up 1: <putylet name = "file1" /> <br /> upload file 2: <input type = "file" name = "file2" /> <r /> <input type = "soume" value = "upload" /> </ form> <br /> $ {requestscope.message} </ body> </html>Servlet
public void doGet (demande httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {try {// 1. Obtenez l'usine de l'analyseur DiskFileItemFactory Factory = new DiskFileItemFactory (); // 2. Obtenez le Parser ServletFileUpload upload = new ServletFileUpload (Factory); // 3. Déterminez le type de formulaire de téléchargement if (! Upload.ismulTipartContent (request)) {// Télécharger le formulaire est un formulaire normal, puis obtenir les données de la manière traditionnelle et retourner; } // Pour télécharger un formulaire, l'analyseur est appelé pour analyser la liste de données de téléchargement <FichierItem> list = upload.PaSeRequest (request); // FileItem // Transipulater la liste pour obtenir le premier objet FileItem de données de téléchargement d'élément de téléchargement pour (FileItem item: list) {if (item.isformField ()) {// Ce que vous obtenez est la chaîne d'élément d'entrée normale name = item.getFieldName (); // Obtenez le nom de la valeur de chaîne d'élément d'entrée = item.getString (); System.out.println (nom + "=" + valeur); } else {// Obtenez la chaîne d'élément d'entrée de téléchargement fileName = item.getName (); // Nom de fichier téléchargé c: / documents et paramètres / thinkPad / Desktop / 1.txt filename = filename.substring (filename.lastIndexof ("//") + 1); InputStream dans = item.getInputStream (); // Get Téléchargé les données int len = 0; tampon d'octet [] = nouveau octet [1024]; // Le répertoire utilisé pour enregistrer les fichiers téléchargés doit interdire au monde extérieur d'accéder directement à String SavePath = this.getServletContext (). GetRealPath ("/ web-inf / upload"); System.out.println (SavePath); FileOutputStream out = new FileOutputStream (SavePath + "/" + FileName); // Écrivez le fichier dans le répertoire de téléchargement while ((len = in.read (tampon))> 0) {out.write (buffer, 0, len); } in.close (); out.close (); request.setAttribute ("Message", "Télécharger le succès"); }}}} catch (exception e) {request.setAttribute ("Message", "téléchargement d'échec"); e.printStackTrace (); }}2. Fonction de téléchargement modifiée:
Notes:
1.
upload.setheDereencoding ("UTF-8"); // Résoudre le code brouillé chinois pour télécharger les noms de fichiers
// Le formulaire est téléchargé pour le fichier, le codage de la demande n'est pas valide et ne peut être converti manuellement
1.1 Value = new String (value.getBytes ("ISO8859-1"), "UTF-8");
1.2 String Value = item.getString ("UTF-8");
2. Pour garantir la sécurité du serveur, les fichiers de téléchargement doivent être placés dans des répertoires qui ne peuvent pas être directement accessibles par le monde extérieur.
3. Pour éviter l'écrasement du fichier, un nom de fichier unique doit être généré pour télécharger le fichier.
4. Pour empêcher trop de fichiers d'apparaître sous un répertoire, vous devez utiliser l'algorithme de hachage pour briser le stockage.
5. Pour limiter la valeur maximale des fichiers téléchargés, vous pouvez utiliser la méthode: servletfileupload.setFileSizEmax (1024) et capture:
FileUploadBase.FileSizelitexechedEdException Exception pour donner des invites conviviales
6. Si vous souhaitez vous assurer que le fichier temporaire est supprimé, vous devez appeler la méthode item.delete après le traitement du fichier de téléchargement.
7. Pour limiter le type de fichier téléchargé: Lors de la réception du nom du fichier téléchargé, déterminez si le nom du suffixe est légal.
8. Écoutez les progrès du téléchargement de fichiers:
ServletFileUpload upload = new ServletFileUpload (Factory); upload.setProgressListener (new ProgressListener () {public void Update (long pbytesRead, long pcontentLength, int arg2) {System.out.println ("La taille du fichier est:" + pcontentLength + ", actuellement traité:" + pbytesRead);}}); 9. Ajouter dynamiquement des éléments d'entrée de téléchargement de fichiers dans la page Web
fonction addInput () {var div = document.getElementById ("fichier"); var input = Document.CreateElement ("Input"); input.type = "fichier"; input.name = "filename"; var del = document.CreateElement ("entrée"); del.type = "bouton"; del.value = "Delete"; del.onclick = fonction d () {this.parentNode.parentNode.removechild (this.parentNode); } var innerDiv = document.CreateElement ("div"); innerdiv.appendChild (entrée); innerdiv.appendChild (del); div.ApendChild (Innerdiv); }Télécharger JSP:
<% @ Page Language = "Java" Import = "Java.util. *" Pageencoding = "UTF-8"%> <! DocType Html public "- // w3c // dtd html 4.01 transitional // en"> <html> <adread> <Titre> My jsp 'upload2.jsp' Page de départ </ title> addInput () {var div = document.getElementById ("fichier"); var input = Document.CreateElement ("Input"); input.type = "fichier"; input.name = "filename"; var del = document.CreateElement ("entrée"); del.type = "bouton"; del.value = "Delete"; del.onclick = fonction d () {this.parentNode.parentNode.removechild (this.parentNode); } var innerDiv = document.CreateElement ("div"); innerdiv.appendChild (entrée); innerdiv.appendChild (del); div.ApendChild (Innerdiv); } </ script> </ head> <body> <form action = "" EncType = "mutlipart / form-data"> </ form> <s tablel> <tr> <td> User: user: </td> <td> <input type = "text" name = "username"> </td> </tr> <tr> <td> upload file: </td> <td> </pr> <td> <td> upload file: </td> Télécharger le fichier "onClick =" addInput () "> </td> </tr> <tr> <td> </td> <td> <div id =" file "> </ div> </td> </td> </ tr> </s table> </ body> </ html>Télécharger le servlet
La classe publique UploadServlet1 étend HttpServlet {public void doGet (HttpServLetRequest Request, HttpServletResponse Response) lance ServletException, ioException {//request.getParamet("Username "); // **** Error request.SetcharAtterencoding ("UTF-8"); // Le formulaire est téléchargé pour le fichier, et le codage de la demande est invalide // Obtenez le fichier téléchargé SavePath = this.getServletContext (). GetRealPath ("/ web-inf / upload"); essayez {diskfileItemfactory factory = new DiskFileItemFactory (); factory.setRepository (nouveau fichier (this.getServletContext (). getRealPath ("/ web-inf / temp"))); ServletFileUpload upload = new ServletFileUpload (Factory); /*UpLoad.SetProgressListener(New ProgressListener () {public void Update (long pbytesRead, long pcontentLength, int arg2) {System.out.println ("taille de fichier est:" + pcontentLength + ", actuellement traité:" + pBytesRead);}}); // Résolvez le code brouillé chinois de téléchargement des noms de fichiers if (! Upload.ismulTipartContent (request)) {// Obtenir les données de manière traditionnelle; } /*upload.setFileSizemax(1024); upload.SetSizEMax (1024 * 10); * / list <FichierItem> list = upload.paSerequest (request); pour (FileItem Item: list) {if (item.isformField ()) {// Les données des éléments d'entrée ordinaires sont encapsulées dans le fileItem String name = item.getFieldName (); String value = item.getString ("UTF-8"); // Value = new String (value.getBytes ("ISO8859-1"), "UTF-8"); System.out.println (nom + "=" + valeur); } else {// Le fichier de téléchargement est encapsulé dans le filetem String filename = item.getName (); // Les fichiers soumis par différents navigateurs sont différents c: /a/b/1.txt 1.txt system.out.println (nom de fichier); if (filename == null || filename.trim (). equals ("")) {continuant; } filename = filename.substring (filename.lastIndexof ("//") + 1); InputStream dans = item.getInputStream (); String SaveFileName = MakeFileName (FileName); // Obtenez le nom de la chaîne enregistrée enregistrée realsAvePath = makePath (SaveFileName, SavePath); // obtient le répertoire de fichier SAVETOIRY FileOutputStream out = new FileOutputStream (realsAvePath + "//" + SaveFileName); tampon d'octet [] = nouveau octet [1024]; int len = 0; while ((len = in.read (tampon))> 0) {out.write (tampon, 0, len); } in.close (); out.close (); item.delete (); // Supprimer le fichier temporaire}}} catch (fileuploadbase.fileSizeliteXededEdException e) {e.printStackTrace (); request.setAttribute ("Message", "Le fichier dépasse la valeur maximale!!"); request.getRequestDispatcher ("/ message.jsp"). Forward (demande, réponse); retour; } catch (exception e) {e.printStackTrace (); }} public String MakeFileName (String FileName) {//2.jpg return uuid.randomuuid (). toString () + "_" + filename; } public String MakePath (String FileName, String SavePath) {int hashCode = filename.hashCode (); int dir1 = hashcode & 0xf; // 0--15 int dir2 = (hashcode & 0xf0) >> 4; // 0-15 String Dir = SavePath + "//" + dir1 + "//" + dir2; // Téléchargez / 2/3 Upload / 3/5 fichier fichier = nouveau fichier (dir); if (! file.exists ()) {file.mkDirs (); } return dir; } public void doPost (requête HttpServletRequest, réponse httpservletResponse) lève ServletException, ioException {doget (request, réponse); }}3. Fonction de téléchargement
// Liste tous les fichiers de téléchargement sur le site Web de classe publique ListFileservlet étend httpservlet {public void doget (httpservletRequest request, httpservletResponse réponse) lance ServletException, ioException {String filepath = this.getServletContext (). GetRealPath ("/ web-inf / upload"); Map map = new HashMap (); listFile (nouveau fichier (filepath), map); request.setAttribute ("map", map); request.getRequestDispatcher ("/ listfile.jsp"). Forward (demande, réponse); } public void listfile (fichier file, map map) {if (! file.isfile ()) {fichiers files [] = file.listFiles (); pour (fichier f: fichiers) {listFile (f, map); }} else {String realName = file.getName (). substring (file.getName (). indexof ("_") + 1); //9349249849-88343-8344_a_fan_davi.avi map.put (file.getName (), realName); }} public void doPost (httpsservletRequest request, httpservletResponse réponse) lève ServletException, ioException {doGet (request, réponse); }}Affichage JSP
<% @ Page Language = "Java" Import = "Java.util. *" Pageencoding = "utf-8"%> <% @ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core"%> <! doctype html public "- // w3c // dtd html 4.01 public" - // w3c // dtd htm.01 public "- // w3c // dtd htm.01 public" - // w3c // dtd htm.01 Transitional // en "> <html> <éad- head> <ititle> mon jsp 'listfile.jsp' Page de départ </tapie> </ head> <body> <c: foreach var =" me "items =" $ {map} "> <c: url value =" / servlet " Value = "$ {me.key}"> </ c: param> </ c: url> $ {me.value} <a href = "$ {downurl}"> télécharger </a> <br/> </c: foreach> </ body> </html>Télécharger le servlet de traitement
La classe publique DownloadServlet étend HttpServlet {public void doGet (HttpServletRequest Request, HttpServletResponse Response) lève Servlexception, ioException {String filename = request.getParameter ("filename"); //23239283-92489-avatar.avi filename = new String (filename.getBytes ("iso8859-1"), "utf-8"); String path = makePath (filename, this.getServletContext (). GetRealPath ("/ web-inf / upload")); Fichier file = nouveau fichier (path + "//" + nom de fichier); if (! file.exists ()) {request.setAttribute ("Message", "La ressource que vous souhaitez télécharger a été supprimée !!"); request.getRequestDispatcher ("/ message.jsp"). Forward (demande, réponse); retour; } String realName = filename.substring (filename.indexof ("_") + 1); Response.sethEader ("Content-Disposition", "attachement; filename =" + urlencoder.encode (realName, "utf-8")); FileInputStream dans = new FileInputStream (path + "//" + nom de fichier); OutputStream out = réponse.getOutputStream (); tampon d'octet [] = nouveau octet [1024]; int len = 0; while ((len = in.read (tampon))> 0) {out.write (tampon, 0, len); } in.close (); out.close (); } public String MakePath (String FileName, String SavePath) {int hashCode = filename.hashCode (); int dir1 = hashcode & 0xf; // 0--15 int dir2 = (hashcode & 0xf0) >> 4; // 0-15 String Dir = SavePath + "//" + dir1 + "//" + dir2; // Téléchargez / 2/3 Upload / 3/5 fichier fichier = nouveau fichier (dir); if (! file.exists ()) {file.mkDirs (); } return dir; } public void doPost (requête HttpServletRequest, réponse httpservletResponse) lève Servlexception, ioException {doget (request, réponse); }}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.