Les exemples de cet article partagent avec vous la technologie de téléchargement de fichiers Java pour votre référence. Le contenu spécifique est le suivant
Formulaire:
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. Tout de suite:
Utilisez des balises HTML dans le formulaire.
Package requis:
Commons-fileupload.jar, l'outil de fichier de téléchargement de base se trouve dans ce package.
Package Commons-io.jar requis pour télécharger des fichiers
Explication détaillée du téléchargement de la classe de fichiers:
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.
<% @ Page Language = "Java" Import = "Java.util. *" Pageencoding = "UTF-8"%> <! DocType Html public "- // w3c // dtd html 4.01 transitional // en"> <html> Board - Proborez-vous de la couche sous-jacente </font> <! - Multipart / Form-data: Multipart (non seulement les fichiers, mais aussi les parties) -> <formulaire Action = "<% = request.getContextPath ()%> / upload0" Method = "Post" EncType = "Multipart / Form-data"> File: <Input Type = "File" name = "fichier" /> <fant type = "soupre Le nom de fichier téléchargé ne peut pas être en chinois, sinon le nom de fichier obtenu est brouillé, mais l'exemple suivant peut résoudre ce problème -> </ form> <br/> <font color = "red" size = "6"> Utilisez l'outil de téléchargement du fichier Apache pour obtenir le fichier téléchargement </font> <! - Application / x-www-form-urlencoded -> <form action = "<% = requier Method = "Post" EncType = "multipart / form-data"> fichier: <input type = "file" name = "file" /> <input type = "soume" value = "upload" /> </orm> <font colore = "red" size = "6"> APACHE File upload tool ENCTYPE = application / x-www-form-urlencoded (valeur par défaut) </p> <p> post2 (formulaire de téléchargement de fichiers): ENCTYPE = multipart / form-data: multipart (non seulement les fichiers, mais aussi les parties) </p> <form action = "<% = request.getContextPath ()%> / upload2" méthode = "post" ENCTYPE = "Multipart / Form-data" type = "file" name = "file" /> <! - post2 (formulaire de fichier de téléchargement) -> <br/> Description du fichier: <entrée type = "text" name = "desc" /> <! - post1 (formulaire normal) -> <br/> fichier 2: <input type = "file" name = "file" /> <br/> File Description 2: <puty type = "text" name = "DESC" 2: <input type = "file" name = "file" /> <br/> Fichier Description 2: <input type = "text" name = "desc" /> <input type = "soumed" value = "upload" /> </ form> <font color = "red" size = "6"> APache File Tool upload pour atteindre le fichier Upload 3 (Breakdown) </font> <! form): encType = application / x-www-form-urlencoded (valeur par défaut) -> <! - Post2 (formulaire de téléchargement de fichiers): encType = multipart / form-data: multipart (non seulement fichiers, mais aussi parties) -> <form action = "<% = request.getContextPath ()%> / upload3" method = "post" enctype = "multipart / form-data"> fichier: Fidre: «Post» ENCTYPE = » type = "file" name = "file" /> <! - Post2 (formulaire de téléchargement de fichier) -> <br/> Description du fichier: <entrée type = "text" name = "desc" /> <! - post1 (formulaire normal) -> <br/> <br/> Fichier 2: <entrée type = "file" name = "file" /> <br/> Fichier Description 2: <puty type = "text" name = "DESC" /> <fort Type = "soumettre Type =" text "Name =" DESC " value = "upload" /> </ form> </ body> </html>
Comprendre la couche inférieure de la carte de transition
Package CN.HNCU.Servlet; Importer Java.io.BuffereDReader; Importer Java.io.ioException; Importer Java.io.inputStream; Importer Java.io.inputStreamReader; Importer Java.io.printwriter; Importer Javax.Servlet.ServletException; Import Javax.Servlet.HTTP.HTTPSERVLE; javax.servlet.http.httpservletRequest; Importer javax.servlet.http.httpservletResponse; public class upload0servlet étend httpservlet {public void dopost (httpservletRequest request, httServetResponse Response) throws servletException, ioexception {entoureat in = request.getInputStream (); BufferedReader br = new BufferedReader (new InputStreamReader (IN)); Ligne de chaîne; while ((line = br.readline ())! = null) {System.out.println (line); }}}Utilisez l'outil de téléchargement de fichiers Apache pour implémenter le téléchargement de fichiers
Package cn.hncu.servlet; import java.io.file; import java.io.ioexception; import java.io.printwriter; importer java.util.list; import java.util.uuid; import javax.servlet.servletException; import javax.servlet.http.httplesvlet; import; import; javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import org.apache.commons.fileupload.fileItem; import org.apache.commons.fileupload.fileUpLadexception; import org.apache.commons.fileupload.disk.diskfileItemfactory; import org.apache.commons.fileupload.servlet.servletFileupload; Import org.apache.commons.io.Fileutils; public class uploadServlet étend httServlet {public vOdD Doget (HTTPSERVLET réponse) lève Servlexception, ioException {réponse.setContentType ("text / html"); Printwriter out = réponse.getWriter (); out.println ("<! doctype html public /" - // w3c // dtd html 4.01 transitional // en / ">"); out.println ("<html>"); out.println ("<adread> <itle> un servlet </Title> </A-head>"); out.println ("<porce>"); Out.print ("ne prend pas en charge le téléchargement ..."); "); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); } public void doPost (requette httpServletRequest, réponse httpservletResponse) lève ServletException, ioException {// sur le serveur, spécifiez un répertoire pour tous les fichiers téléchargés Path = getServletContext (). GetRealPath ("/ upload"); System.out.println ("Path:" + Path); Fichier dir = nouveau fichier (chemin); if (! dir.exists ()) {dir.mkDirs (); } // Créer une usine basée sur un disque dur // diskfileItemfactory disk = new DiskFileItemFactory (); // Définit le répertoire temporaire (il est recommandé de concevoir un répertoire temporaire, sinon le répertoire temporaire du système sera utilisé.) //Disk.setRepository(NEW File ("D: / a")); // 3. Définissez la taille du tampon pour l'écriture de données sur le disque dur disque.SetSizethReshold (1024 * 4); // Lorsque le fichier est plus grand que ce paramètre, un fichier temporaire sera formé dans le répertoire temporaire // Définissez la taille du tampon de fichier temporaire - tampon 8K, adresse temporaire DiskFileItemFactory F = nouveau diskfileItemFactory (1024 * 8, nouveau fichier ("d: / a")); // Télécharger l'outil - Créez un objet pour analyser ServletFileUpload upload = new ServletFileUpload (f); upload.setFileSizEMax (1024 * 1024 * 5); // Définissez le fichier unique maximum téléchargé sur 5m // définissez la taille maximale du fichier téléchargé. S'il s'agit de plusieurs fichiers, il s'agit de la somme de plusieurs fichiers jusqu'à 8m upload.SetSizEMax (1024 * 1024 * 8); // Définissez la somme de toutes les tailles de fichiers téléchargées jusqu'à 8m // Utilisez l'outil d'analyse pour analyser Try {list <FeleItem> list = upload.parseRequest (request); pour (fileItem fi: list) {System.out.println ("Type de contenu de fichier:" + fi.getContentType ()); // Type de contenu de fichier: Text / Plain System.out.println ("Nom de fichier:" + fi.getname ()); // Nom de la chaîne de fichiers: C: /USERS/ADL1/DESKTOP/A.TXT Name: C: /USERS/adl1/desktop/a.txt ext = fi.getName (). substring (fi.getName (). LastIndexof (".")); //. Txt String UUID = uUid.randomuuid (). toString (). Remplace ("-", ""); String FileName = UUID + ext; // fileutils.copyInputStreamtoFile (fi.getInputStream (), nouveau fichier ("d: /a/d/a.txt")); // Write It Dead // fi.getInputStream () est le fichier réel fileUtils.copyInputStreamtoFile (fi.getInputStream (), new File (path + "/" + filename)); // l'écriture vivant}} catch (fileUpLoadexception e) {e.printStackTrace (); }}} Stocker des fichiers téléchargés à cet endroit
Télécharger des informations:
Télécharger les résultats:
Utilisez l'outil de téléchargement de fichiers Apache pour réaliser le téléchargement de fichiers 2 (résoudre le nom de fichier brouillé)
Package cn.hncu.servlet; import java.io.file; import java.io.ioexception; import java.io.printwriter; importer java.util.list; import java.util.uuid; import javax.servlet.servletException; import javax.servlet.http.httplesvlet; import; import; javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import org.apache.commons.fileupload.fileItem; import org.apache.commons.fileupload.fileUpLadexception; import org.apache.commons.fileupload.disk.diskfileItemfactory; import org.apache.commons.fileupload.servlet.servletFileupload; import org.apache.commons.io.fileutils; public class upload2servlet étend httServlet {public Void doGet (HTTPServletServe HttpServletResponse Response) lève Servlexception, ioException {réponse.setContentType ("Text / Html"); // S'il s'agit d'un formulaire contenant des fichiers téléchargés (POST2), le drame ne peut définir le codage que dans le nom de fichier du fichier téléchargé (résoudre son code brouillé chinois) // mais il ne peut pas résoudre le code brouillé chinois des composants de formulaire ordinaire dans le mode Post2 PRINTWRER OUT = Response.getWriter (); out.println ("<! doctype html public /" - // w3c // dtd html 4.01 transitional // en / ">"); out.println ("<html>"); out.println ("<adread> <itle> un servlet </Title> </A-head>"); out.println ("<porce>"); Out.print ("ne prend pas en charge le téléchargement ..."); "); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); } public void doPost (demande httpservletRequest, réponse httpservletResponse) lance le servletException, ioException {// étape 1 // formulaire ordinaire (post1), la phrase suivante peut définir le codage du contenu de la composante de formulaire ordinaire (peut résoudre leur problème chinois grillé) request.secharacterencoding ("utf-8"); // S'il s'agit d'un formulaire contenant des fichiers téléchargés (post2), cette phrase ne peut définir le codage que dans le nom de fichier du fichier téléchargé (résoudre son code brouillé chinois). Mais il ne peut pas résoudre le code brouillé du composant de formulaire ordinaire (ne peut pas définir son encodage) // sur le serveur, spécifiez un répertoire pour tous les fichiers téléchargés Path = getServletContext (). GetRealPath ("/ upload"); System.out.println ("Path:" + Path); Fichier dir = nouveau fichier (chemin); if (! dir.exists ()) {dir.mkDirs (); } // Définissez la taille du tampon de fichier temporaire - tampon 8K, adresse temporaire DiskFileItemfactory F = new DiskFileItemFactory (1024 * 8, nouveau fichier ("d: / a")); // Télécharger l'outil ServletFileUpload upload = new ServletFileUpload (f); upload.setFileSizEMax (1024 * 1024 * 5); // Définissez le fichier unique maximum téléchargé sur 5m upload.setSizemax (1024 * 1024 * 8); // Définissez la somme de toutes les tailles de fichiers téléchargées sur 8m // Utilisez l'outil d'analyse pour analyser l'essai {list <FeleItem> list = upload.parseRequest (request); for (fileItem fi: list) {if ((fi.isformField ())) {// Si c'est un composant de formulaire normal: cocher, radio, mot de passe ... // string desc = fi.getString (); System.out.println ("fi.getString ():" + fi.getString ()); // String de deuxième étape desc = fi.getString ("utf-8"); // Cette phrase définit le codage de contenu du composant de formulaire ordinaire System.out.println ("après l'encodage:" + desc); } else {String ext = fi.getName (). substring (fi.getName (). LastIndexof (".")); //. Txt String uuid = uuid.randomuuid (). toString (). Remplace ("-", ""); String filename = uuid + ext; //fi.getInputStream () est la véritable information de fichier fileutils.copyInputStreamtoFile (fi.getInputStream (), nouveau fichier (path + "/" + filename)); // l'écriture vivant}}} catch (fileuploadexception e) {e.printStStackTrace (); }}}Télécharger des informations:
Télécharger les résultats:
Utilisez l'outil de téléchargement de fichiers Apache pour réaliser le téléchargement de fichiers 3 (ventilation du fichier)
Optimiser le stockage de fichiers avec le répertoire de hachage:
Le répertoire de hachage est une méthode pour optimiser les performances de stockage des fichiers. Qu'il s'agisse de Windows ou Linux, que ce soit NTFS ou EXT3, le nombre d'éléments qui peuvent être hébergés dans chaque répertoire est limité.
Ce n'est pas qu'il ne peut pas être enregistré, mais lorsque le nombre de projets est trop important, la vitesse d'indexation des fichiers sera réduite.
Par conséquent, il est nécessaire de peser le nombre de fichiers qui doivent être enregistrés dans un répertoire. Économiser trop affectera les performances, bien que l'économie trop peu provoquera trop de répertoires et de gaspillage d'espace. Ainsi, lorsque vous enregistrez de gros lots de fichiers,
Il existe un algorithme qui peut "casser" les fichiers plus uniformément dans différentes sous-répertoires pour améliorer la vitesse d'index de chaque niveau. Cet algorithme est de hachage. Le MD5, SHA1, etc. couramment utilisé peut être utilisé comme répertoire de hachage. MD5 est également utilisé dans ma session pour obtenir les premier et neuvième chiffres de SessionID, qui constitue un chemin de hachage à deux niveaux. C'est-à-dire que le système distribue tous les fichiers de session à 16 × 16 = 256 sous-répertoires. En supposant que la sauvegarde de 1000 fichiers dans chaque répertoire de Linux peut atteindre le meilleur rapport de performances de l'espace, le système peut idéalement avoir 256 000 fichiers de session utilisés en même temps.
Package cn.hncu.servlet; import java.io.file; import java.io.ioexception; import java.io.printwriter; importer java.util.list; import java.util.uuid; import javax.servlet.servletException; import javax.servlet.http.httplesvlet; import; import; javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import org.apache.commons.fileupload.fileItem; import org.apache.commons.fileupload.progress; import org.apache.commons.fileupload.progress; import Org.apache.Commons.fileupload.progress; import Org.apache.Commons.FileupLoad org.apache.commons.fileupload.disk.diskfileItemfactory; import org.apache.commons.fileupload.servlet.servletFileupload; import org.apache.commons.io.fileutils; public class upload3servlet étend httplets {public Void doGet (HTTPSservlet remercie, httvlet {public Void doGet (HTTPServletRedest Condol, HttpServletResponse Response) lève Servlexception, ioException {réponse.setContentType ("Text / Html"); // S'il s'agit d'un formulaire contenant des fichiers téléchargés (POST2), le drame ne peut définir le codage que dans le nom de fichier du fichier téléchargé (résoudre son code brouillé chinois) // mais il ne peut pas résoudre le code brouillé chinois des composants de formulaire ordinaire dans le mode Post2 PRINTWRER OUT = Response.getWriter (); out.println ("<! doctype html public /" - // w3c // dtd html 4.01 transitional // en / ">"); out.println ("<html>"); out.println ("<adread> <itle> un servlet </Title> </A-head>"); out.println ("<porce>"); // Obtenez la pièce après le "?" numéro dans l'URL dans la méthode GET // http: // localhost: 8080 / servletdemo3 / upload? name = jack & sexe = mâle string qstr = request.getQueryString (); System.out.println ("qstr:" + qstr); // qstr: name = jack & sexe = mâle out.print ("ne prend pas en charge la mise à charge ... ..."); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); } public void doPost (requête HttpServletRequest, réponse httpservletResponse) lève ServletException, ioException {réponse.setContentType ("text / html; charset = utf-8"); Printwriter out = réponse.getWriter (); // 1 Anti-Black: Le front-end de la protection est soumis à l'aide de la méthode post1 // Méthode 1 / * String Type = request.getContentType (); if (! type.contains ("multipart / form-data")) {out.println ("Soumission de formulaire non soutenue"); retour; } * / // Méthode 2 boolean boo = servletFileupload.ismulTipartContent (request); if (! boo) {out.println ("Soumission de formulaire non soutenue"); retour; } // Étape 1 // Formulaire ordinaire (post1), la phrase suivante peut définir le codage du contenu du composant de formulaire ordinaire (peut résoudre leur problème brouillé chinois) request.SetcharAtterencoding ("UTF-8"); // S'il s'agit d'un formulaire contenant des fichiers téléchargés (post2), cette phrase ne peut définir le codage que dans le nom de fichier du fichier téléchargé (résoudre son code brouillé chinois). Mais il ne peut pas résoudre le code brouillé du composant de formulaire ordinaire (ne peut pas définir son encodage) // sur le serveur, spécifiez un répertoire pour tous les fichiers téléchargés Path = getServletContext (). GetRealPath ("/ upload"); System.out.println ("Path:" + Path); Fichier dir = nouveau fichier (chemin); if (! dir.exists ()) {dir.mkDirs (); } // Définissez la taille du tampon de fichier temporaire - tampon 8K, adresse temporaire DiskFileItemfactory F = new DiskFileItemFactory (1024 * 8, nouveau fichier ("d: / a")); // Télécharger l'outil ServletFileUpload upload = new ServletFileUpload (f); upload.setFileSizEMax (1024 * 1024 * 5); // Définissez le fichier unique maximum téléchargé sur 5m upload.setSizemax (1024 * 1024 * 8); // Définit la somme maximale de toutes les tailles de fichiers téléchargées est de 8 m // ▲ 4 Upload Progress Listening upload.SetProgressListener (new ProgressListener () {private Double Pre = 0d; @ Override // Paramètre 1: combien d'octets ont été téléchargés paramètre 2: combien d'octets sont le paramètre total 3: quel fichier (numéro sérial commence 1) PITEMS) {Double D = 1,0 * PBYTERAD / PCONTENTLENDE * 100; // Utilisez l'outil d'analyse pour analyser Try {list <FequeItem> list = upload.parseRequest (request); for (fileItem fi: list) {if ((fi.isformField ())) {// Si c'est un composant de formulaire normal: cocher, radio, mot de passe ... // string desc = fi.getString (); System.out.println ("fi.getString ():" + fi.getString ()); // String de deuxième étape desc = fi.getString ("utf-8"); // Cette phrase définit le codage de contenu du composant de formulaire normal System.out.println ("Encoding:" + desc); } else {// Protect: Filtrez des composants de fichiers vides qui n'ont pas sélectionné if (fi.getSize () <= 0) {continu; // Lire le fichier suivant} system.out.println ("Type de contenu de fichier:" + fi.getContentType ()); // Fichier Contenu Type: Text / Plain System.out.println ("Fichier Nom:" + Fi.getname (); C: /users/adl1/desktop/a.txt String ext = fi.getName (). Substring (fi.getName (). LastIndexof (".")); //. Txt String uUid = uuid.randomuuid (). ToString (). Remplace (",", ""); String filename = uuid + ext; // File Directory Breaking Technology String dir1 = Integer.tohexString (uUid.hashcode () & 0x0f); String dir2 = Integer.tohexString ((uUid.hashcode () & 0xf0) >> 4); //fi.getInputStream () est le vrai fichier d'informations fileutils.copyInputStreamtoFile (fi.getInputStream (), nouveau fichier (path + "/" + dir1 + "/" + dir2 + "/" + filename)); // écrit vivant}}} catch (fileupLadexception e) {e.printStackTrace ();); }}}Brisez le message:
Brisez les résultats:
Fichier 1:
Fichier 2:
Démontrer le principe de la progression du téléchargement
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.