Die Beispiele in diesem Artikel teilen Ihnen die Java -Datei -Hochladentechnologie für Ihre Referenz mit Ihnen. Der spezifische Inhalt ist wie folgt
Bilden:
Der Client muss den Datentyp Multipart/Form-Daten verwenden, um den zusammengesetzten Datentyp beim Senden von HTTP darzustellen. Im Augenblick:
Verwenden Sie HTML -Tags im Formular.
Paket erforderlich:
Commons-fileUpload.jar, Das Core-Upload-Datei-Tool befindet sich in diesem Paket.
Commons-io.jar-Paket, das zum Hochladen von Dateien erforderlich ist
Detaillierte Erläuterung des Hochladens Dateiklassen:
DiskFileItemFactory - Erstellen Sie ein Zeitüberwachungsdateiverzeichnis, das sich auf die Größe der Cache -Fläche bezieht
ServletFileUpload wird verwendet, um httpServletRequest zu analysieren. Gibt eine Reihe von Dateiobjekten zurück.
FileItem repräsentiert jedes vom Benutzer hochgeladene Dateiobjekt.
<%@ page Language = "java" import = "java.util. Board-Verstehen Sie die zugrunde liegende Schicht </font> <!-MultiPart/Form-Data: MultiPart (nicht nur Dateien, sondern auch Teile)-> <Formatelung = "<%= request.getContextPath ()%>/Upload" methode = "post" EncTtype = "multiPart/Form-data"> Datei: <input type = "file" Datei "Datei" Datei "Datei" Datei "Datei". <!-Der hochgeladene Dateiname kann nicht in Chinesisch sein, andernfalls ist der erhaltene Dateiname verstümmelt, aber das folgende Beispiel kann dieses Problem lösen-> </Form> <br/> <font color = "rot" size = "6"> Verwenden Sie das Apache-Datei-Upload-Tool, um Datei-Upload zu erreichen. method = "post" engType = "MultiPart/Form-Data"> Datei: <Eingabe type = "Datei" name = "Datei"/> <Eingabe type = "value =" upload "/> </form> <font color =" Red "size =" 6 "> Verwenden Sie das Apache-Datei-Tool, um die Datei-Upload-Datei zu erreichen. enctype=application/x-www-form-urlencoded (default value) </p> <p> POST2 (upload file form): enctype=multipart/form-data:multipart (not only files, but also parts) </p> <form action="<%=request.getContextPath()%>/upload2" method="post" enctype="multipart/form-data"> Datei: <Eingabe type = "Datei" name = "Datei"/> <!-post2 (Dateiformular hochladen)-> <br/> Datei Beschreibung: <Eingabe type = "text" name = "Desc"/> <!-post1 (normales Formular)-> <br/> Datei 2: <Eingabe type = "Datei" Name ". -> <br/> Datei 2: <Eingabe type = "Datei" name = "file"/> <br/> Datei Beschreibung 2: <Eingabe type = "text" name = "desc"/> <Eingabe type = "value =" upload "/> </form> <font color =" Red "size =" 6 "> Verwenden Sie die APache-Datei-Aufladung. Formular): engType = application/x-www-form-urlencoded (Standardwert)-> <!-Post 2 (Formular hochladen): engType = MultiPart/Form-Data: MultiPart (nicht nur Dateien, sondern auch Teile)-> <form action = "<%= Anfrage Typ = "Datei" name = "Datei"/> <!-post2 (Dateiformular hochladen)-> <br/> Dateibeschreibung: <Eingabe type = "text" name = "Desc"/> <!-post1 (Normale Formular)-> <br/> <br/> Datei 2: <Eingabe type = "Datei" Name ". value = "Upload"/> </form> </body> </html>
Verständnis der unteren Schicht der Übergangskarte
Paket cn.hncu.servlet; import Java.io.bufufferedReader; Import Java.io.ioxception; Import Java.io.inputStream; Import Java.io.inputStreamReader; Import Java.io.io.printwriter; javax.servlet.http.httpServletRequest; import Javax.servlet.http.httpsertResponse; öffentliche Klasse Upload0Servlet erweitert HttpServlet. in = request.getInputStream (); BufferedReader BR = neuer BufferedReader (neuer InputStreamReader (in)); Stringlinie; while ((line = br.readline ())! = null) {System.out.println (Linie); }}}Verwenden Sie das Apache -Datei -Upload -Tool, um das Datei -Upload zu implementieren
Paket cn.hncu.servlet; import Java.io.file; import Java.io.ioException; import Java.io.printwriter; import Java.util.list; import Java.util.uuid; Import Javax.Servlet.ServletException; Import Javax.Servlet.httplet.httpl. javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpservletResponse; import org.apache.commons.FileUpload.FileItem; importieren org.apache.commons.fileupload.FileUploadexception; org.apache.commons.FileUpload.disk.diskFileItemFactory; import org.apache.commons.fileUpload.servlet.servletFileUpload; Import org.apache.commons.io.fileStils; öffentliche Klassen -Upload -Service erweitert HtttpServe {öffentlich {{{{{{{{{{{{{{{{{{{{{{{oder HttpServletResponse -Antwort) löst ServletException aus, ioException {response.setContentType ("text/html"); Printwriter out = response.getWriter (); out.println ("<! docType html public/"-// w3c // dtd html 4.01 transitional // en/">"); out.println ("<html>"); out.println ("<kopf> <titels> a servlet </title> </head>"); out.println ("<body>"); out.print ("unterstützt nicht das Aufladen des Aufladens ..."); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); } public void dopost (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, IOException {// auf dem Server, geben Sie ein Verzeichnis für alle hochgeladenen Dateien String path = getServletContext () GetRealPath ("/Upload"). System.out.println ("Pfad:"+Path); Datei DIR = New Datei (Pfad); if (! Dir.Exists ()) {dir.mkdirs (); } // Erstellen Sie ein fest diskutiertes Werk // diskFileItemFactory disk = new diskFileItemfactory (); // Temporäres Verzeichnis festlegen (es wird empfohlen, ein temporäres Verzeichnis zu entwerfen, andernfalls wird das Systemverzeichnis des Systems verwendet.) //Disk.setRepository(New -Datei ("D:/a")); // 3. Stellen Sie die Puffergröße für das Schreiben von Daten auf die Festplattenscheibe (1024*4) fest; // Wenn die Datei größer als diese Einstellung ist, wird im temporären Verzeichnis eine temporäre Datei gebildet // Setzen Sie die temporäre Dateipuffergröße-8K-Puffer, temporäre Dateiadresse diskfileTemFactory f = new diskfileItemfactory (1024*8, neue Datei ("D:/a"); // Tool hochladen-Erstellen Sie ein Objekt zum Parsen servletFileUpload upload = new servletFileUpload (f); Upload.SetFilesimemax (1024*1024*5); // Setzen Sie die maximale hochgeladene einzelne Datei auf 5 m // Setzen Sie die maximale Größe der hochgeladenen Datei. Wenn es sich um mehrere Dateien handelt, handelt es sich um die Summe mehrerer Dateien bis zu 8 m hochladen. Setsizemax (1024*1024*8); // Setzen Sie die Summe aller hochgeladenen Dateigrößen auf 8m // mit dem Parsing -Tool zum Analysieren von Versuch {list <FileItem> list = upload.ParSequest (Anfrage); für (FileItem fi: list) {System.out.println ("Dateiinhaltstyp:"+fi.getContTtype ()); // Dateiinhaltstyp: text/klare System.out.println ("Dateiname:"+fi.getName ()); // Dateiname: c: /users/adl1/desktop/desktop/desktop/a.ttx String String String String String String String String String String String ext = fi.getName (). substring (fi.getName (). lastIndexof (".")); //. txt string uUid = uUid.randomuuid (). toString (). ersetzen ("-", "); String fileName=uuid+ext;// FileUtils.copyInputStreamToFile(fI.getInputStream(), new File("d:/a/d/a.txt"));//Write it dead//fI.getInputStream() is the real file information FileUtils.copyInputStreamToFile(fI.getInputStream(), new Datei (Pfad+"/"+Dateiname)); // Schreiben Sie es lebendig}} catch (FileUploadexception e) {e.printstacktrace (); }}} Speichern Sie hochgeladene Dateien an diesem Ort
Informationen hochladen:
Ergebnisse hochladen:
Verwenden Sie das Apache -Datei -Upload -Tool, um das Datei hochzuladen 2 (Lösen Sie den Namen der verstümmelten Datei).
Paket cn.hncu.servlet; import Java.io.file; import Java.io.ioException; import Java.io.printwriter; import Java.util.list; import Java.util.uuid; Import Javax.Servlet.ServletException; Import Javax.Servlet.httplet.httpl. javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpservletResponse; import org.apache.commons.FileUpload.FileItem; importieren org.apache.commons.fileupload.FileUploadexception; org.apache.commons.FileUpload.disk.diskFileItemfactory; import org.apache.commons.FileUpload.servlet.servletFileUpload; HttpServletResponse -Antwort) löst ServletException aus, ioException {response.setContentType ("text/html"); // Wenn es sich um ein Formular mit hochgeladenen Dateien (Post2) handelt, kann das Drama die Encodierung nur im Dateinamen der hochgeladenen Datei festlegen (seinen chinesischen verstümmelten Code lösen) //, aber es kann den chinesischen verstümmelten Code aus gewöhnlichen Formularkomponenten in dem post2 -Modus -Prinker out = reaktionwriter () nicht lösen. out.println ("<! docType html public/"-// w3c // dtd html 4.01 transitional // en/">"); out.println ("<html>"); out.println ("<kopf> <titels> a servlet </title> </head>"); out.println ("<body>"); out.print ("unterstützt nicht das Aufladen des Aufladens ..."); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); } public void dopost (httpServletRequest-Anforderung, HttpServletResponse-Antwort) löst ServletException aus, IOException {// Schritt 1 // Formularformular (Post1) kann die Codierung des Inhalts der gewöhnlichen Formkomponente (Can ihre chinesische Küche problematisch) festlegen. // Wenn es sich um ein Formular mit hochgeladenen Dateien (Post 2) handelt, kann dieser Satz die Codierung nur im Dateinamen der hochgeladenen Datei festlegen (lösen Sie den chinesischen verstümmelten Code). Es kann jedoch nicht den verstümmelten Code der gewöhnlichen Formularkomponente (seine Encodierung festlegen) // auf dem Server nicht lösen, ein Verzeichnis für alle hochgeladenen Dateien String path = getServletContext (). GetRealPath ("/Upload"); System.out.println ("Pfad:"+Path); Datei DIR = New Datei (Pfad); if (! Dir.Exists ()) {dir.mkdirs (); } // Setzen Sie die temporäre Dateipuffergröße-8K-Puffer, temporäre Dateiadresse diskFileItemFactory f = new diskFileItemfactory (1024*8, neue Datei ("d:/a"); // Tool hochladen servletFileUpload upload = new ServletFileUpload (f); Upload.SetFilesimemax (1024*1024*5); // Setzen Sie die maximal hochgeladene einzelne Datei auf 5m hochladen. SetSizemax (1024*1024*8); // Setzen Sie die Summe aller hochgeladenen Dateigrößen auf 8m // mit dem Parsing -Tool, um Try {list <FileItem> list = upload.ParSequest (Request) zu analysieren. für (fileItem fi: list) {if ((fi.isformfield ())) {// Wenn es sich um eine normale Formularkomponente handelt: Kontrollkästchen, Radio, Passwort ... // String Desc = fi.getString (); System.out.println ("fi.getString ():"+fi.getString ()); // zweiter Schritt String desc = fi.getString ("utf-8"); // Dieser Satz legt die Inhaltscodierung des normalen Formularkomponentensystems fest. } else {string ext = fi.getName (). substring (fi.getName (). lastIndexof (".")); //. txt string uUid = uUid.randomuuid (). toString (). Ersatz ("-", "); String Dateiname = uUid+ext; //fi.getInputStream () ist die reale Dateiinformationsdateiutils.copyInputStreamToFile (fi.getInputStream (), neue Datei (Pfad+"/"+Dateiname)); // schreiben Sie es lebendig}}} catch (FileUtloadexception E) {E.printStacktrace (); }}}Informationen hochladen:
Ergebnisse hochladen:
Verwenden Sie das Apache -Datei -Upload -Tool, um das Datei hochladen 3 (Dateiaufschlüsselung) zu erreichen.
Optimieren Sie den Dateispeicher mit dem Hash -Verzeichnis:
Das Hash -Verzeichnis ist eine Methode zur Optimierung der Dateispeicherleistung. Unabhängig davon, ob es sich um Windows oder Linux handelt, ob es sich um NTFS oder ext3 handelt, ist die Anzahl der Elemente, die in jedem Verzeichnis berücksichtigt werden können, begrenzt.
Es ist nicht so, dass es nicht gespeichert werden kann, aber wenn die Anzahl der Projekte zu groß ist, wird die Dateiindizierungsgeschwindigkeit reduziert.
Daher ist es notwendig, wie viele Dateien in einem Verzeichnis gespeichert werden sollten. Zu viel zu sparen wirkt sich auf die Leistung aus, während es zu viele Verzeichnisse und Raumverschwendung verursacht. Also beim Speichern großer Chargen von Dateien,
Es gibt einen Algorithmus, der die Dateien in verschiedenen Unterverzeichnissen gleichmäßiger "brechen" kann, um die Indexgeschwindigkeit jeder Ebene zu verbessern. Dieser Algorithmus ist Hash. Das häufig verwendete MD5, SHA1 usw. kann als Hash -Verzeichnis verwendet werden. MD5 wird auch in meiner Sitzung verwendet, um den ersten und neunten Stellen der Sitzung zu erhalten, das einen zweistufigen Hash-Pfad darstellt. Das heißt, das System verteilt alle Sitzungsdateien auf 16 × 16 = 256 Unterverzeichnisse. Unter der Annahme, dass das Speichern von 1000 Dateien in jedem Verzeichnis von Linux das beste Speicherleistungsverhältnis erreichen kann, kann das System idealerweise gleichzeitig 256.000 Sitzungsdateien verwendet.
Paket cn.hncu.servlet; import Java.io.file; import Java.io.ioException; import Java.io.printwriter; import Java.util.list; import Java.util.uuid; Import Javax.Servlet.ServletException; Import Javax.Servlet.httplet.httpl. javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpservletResponse; import org.apache.commons.FileUpload.FileItem; importieren org.apache.commons.fileupload.FileUploadexception; org.apache.commons.FileUpload.ProgressListener; import org.apache.commons.FileUpload.disk.diskFileMfactory; {public void dodget (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, iOException {response.setContentType ("text/html"); // Wenn es sich um ein Formular mit hochgeladenen Dateien (Post2) handelt, kann das Drama die Encodierung nur im Dateinamen der hochgeladenen Datei festlegen (seinen chinesischen verstümmelten Code lösen) //, aber es kann den chinesischen verstümmelten Code aus gewöhnlichen Formularkomponenten in dem post2 -Modus -Prinker out = reaktionwriter () nicht lösen. out.println ("<! docType html public/"-// w3c // dtd html 4.01 transitional // en/">"); out.println ("<html>"); out.println ("<kopf> <titels> a servlet </title> </head>"); out.println ("<body>"); // Holen Sie sich das Teil nach dem "?" Nummer in der URL in der GET -Methode // http: // localhost: 8080/servletDemo3/Upload? Name = Jack & sex = männliche String qstr = request.getQueryString (); System.out.println ("qstr:"+qstr); // qstr: name = jack & sex = male out.print ("Nicht unterstützen Sie das Upload ..."); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); } public void dopost (httpServletRequest-Anforderung, httpServletResponse-Antwort) löst ServletException aus, iOException {response.setContentType ("text/html; charset = utf-8"); Printwriter out = response.getWriter (); // 1 Anti-Black: Das Front-End des Schutzes wird mit der Post1-Methode übermittelt // Methode 1 /* String type = request.getContentType (); if (! type.contains ("multiPart/form-data")) {out.println ("nicht unterstützte Formularunterwerfung"); zurückkehren; }*/// Methode 2 boolean boo = servletFileUpload.ismultipartContent (Anfrage); if (! boo) {out.println ("nicht unterstützte Formulare"); zurückkehren; } // Schritt 1 // Gewöhnliches Formular (post1) kann der folgende Satz die Codierung des Inhalts der gewöhnlichen Formularkomponente festlegen (kann ihre chinesische Haftprobleme lösen). // Wenn es sich um ein Formular mit hochgeladenen Dateien (Post 2) handelt, kann dieser Satz die Codierung nur im Dateinamen der hochgeladenen Datei festlegen (lösen Sie den chinesischen verstümmelten Code). Es kann jedoch nicht den verstümmelten Code der gewöhnlichen Formularkomponente (seine Encodierung festlegen) // auf dem Server nicht lösen, ein Verzeichnis für alle hochgeladenen Dateien String path = getServletContext (). GetRealPath ("/Upload"); System.out.println ("Pfad:"+Path); Datei DIR = New Datei (Pfad); if (! Dir.Exists ()) {dir.mkdirs (); } // Setzen Sie die temporäre Dateipuffergröße-8K-Puffer, temporäre Dateiadresse diskFileItemFactory f = new diskFileItemfactory (1024*8, neue Datei ("d:/a"); // Tool hochladen servletFileUpload upload = new ServletFileUpload (f); Upload.SetFilesimemax (1024*1024*5); // Setzen Sie die maximal hochgeladene einzelne Datei auf 5m hochladen. SetSizemax (1024*1024*8); // Setzen Sie die maximale Summe aller hochgeladenen Dateigrößen 8m // ▲ 4 Hochladen Fortschritt Anhören hochladen Pitems) {double d = 1.0*pByteread/pcontentLength*100; // Parsing -Tool verwenden, um Try {list <FileItem> list = upload.ParSequest (Request) zu analysieren; für (fileItem fi: list) {if ((fi.isformfield ())) {// Wenn es sich um eine normale Formularkomponente handelt: Kontrollkästchen, Radio, Passwort ... // String Desc = fi.getString (); System.out.println ("fi.getString ():"+fi.getString ()); // zweiter Schritt String desc = fi.getString ("utf-8"); // Dieser Satz legt die Inhaltscodierung des normalen Formularkomponentensystems fest. } else {// Protect: Filtern Sie leere Dateikomponenten heraus, die nicht ausgewählt haben, wenn (fi.getSize () <= 0) {Fortsetzung; // Die nächste Datei lesen} system.out.println ("Dateiinhaltstyp:"+fi.getConttype ()); // Dateiinhaltstyp: Text/Plain System.Out.OUT.Println ("Dateiname:" Dateiname: "/). C: /Users/adl1/desktop/a.txt string ext = fi.getName (). Substring (fi.getName (). String Dateiname = uUid+ext; // Dateiverzeichnis Breaking Technology String Dir1 = Integer.tohexString (uUid.hashcode () & 0x0f); String dir2 = Integer.tohexString ((uUid.hashCode () & 0xf0) >> 4); //fi.getInputStream () ist die reale Dateiinformationsdateiutils.copyInputStreamtofile (fi.getInputStream (), neue Datei (Pfad+"/"+dir1+"/"+dir2+"/"+fileName); // schriftlich}}} catch (FileuPloadexception E) {E.Printstacktra (). }}}Brechen Sie die Nachricht:
Brechen Sie die Ergebnisse:
Datei 1:
Datei 2:
Demonstrieren Sie das Prinzip des Upload -Fortschritts
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.