Das Datei -Upload ist in Webanwendungen sehr häufig. Es ist sehr einfach, die Datei -Upload -Funktion in der JSP -Umgebung zu implementieren, da in Java im Internet viele Datei -Upload -Komponenten entwickelt werden. Dieser Artikel nimmt die Commons-FileUpload-Komponente als Beispiel für die Hinzufügen von Datei-Upload-Funktionen zu JSP-Anwendungen.
Die Common-FileUpload-Komponente ist eines der Open-Source-Projekte von Apache und kann von http://jakarta.apache.org/commons/Fileeupload/ heruntergeladen werden.
Mit dieser Komponente können Sie eine oder mehrere Dateien gleichzeitig hochladen und die Dateigröße begrenzen.
Entpacken Sie nach dem Herunterladen das ZIP-Paket und kopieren Sie Commons-fileUpload-1.0.jar in die WebApps von Tomcat unter Ihrem WebAppweb-Inflib. Wenn das Verzeichnis nicht vorhanden ist, erstellen Sie bitte Ihr eigenes Verzeichnis.
Erstellen Sie ein neues Servlet: Upload.java für das Datei -Upload:
import Java.io.*; import Java.util.*; Javax.servlet importieren.*; importieren javax.servlet.http.*; import org.apache.commons.FileUpload.*; Public Class Upload erweitert httpServlet {private String uploadPath = "C: Upload"; // Verzeichnis zum Hochladen von Dateien private String temppath = "C: UploadTMP"; // Temporary File Directory Public void dopost (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst IOException, ServletException {}} ausIn der Dopost () -Methode wird das vom Browser ausgestellte Post -Anforderung an die Postanforderung erhält, die Datei -Upload realisiert. Hier ist der Beispielcode:
public void dopost (httpServletRequest Request, httpServletResponse -Antwort) löst IOException aus, ServletException {try {diskFileUpload fu = new diskFileUpload (); // Setzen Sie die maximale Dateigröße, hier ist 4mbfu.setsizemax (4194304); // Setzen Sie die Puffergröße, hier ist 4KBFU.SetSizethreshold (4096); // Setzen Sie das temporäre Verzeichnis: fu.setRepositoryPath (temppath); // alle Dateien abrufen: list FileItems = fu.parsequest (Anfrage); Iterator i = FileItems.iterator (); // jede Datei nacheinander verarbeiten: while (i.hasnext ()) {fileItem fi = (fileItem) i.Next (); // den Dateinamen abrufen, der Dateiname enthält den Pfad: String Dateiname = fi.getName (); // Hier können Sie Benutzer- und Dateiinformationen aufzeichnen // ... // in die Datei schreiben, der vorläufige Dateiname ist A.TXT und der Dateiname kann aus dem Dateinamen extrahiert werden: fi.write (neue Datei (UploadPath + "A.txt"); }} catch (Ausnahme e) {// Sie können zur Fehlerseite springen}}Wenn Sie den angegebenen Upload -Ordner in der Konfigurationsdatei lesen möchten, können Sie ihn in der Init () -Methode ausführen:
public void init () löst ServletException aus {UploadPath = .... temppath = .... // Wenn der Ordner nicht existiert, wird automatisch erstellt: if (! Neue Datei (UploadPath) .IsDirectory ()) neue Datei (UploadPath) .mkdirs (); if (! Neue Datei (temppath) .isDirectory ()) neue Datei (temppath) .mkdirs (); }Kompilieren Sie den Servlet und achten Sie darauf, dass Sie den Klassenpfad angeben.
Konfigurieren Sie das Servlet, öffnen Sie Notepad, um Tomcatwebapps für Ihre WebAppweb-infweb.xml zu öffnen, und erstellen Sie eine neue, wenn nicht.
Typische Konfigurationen sind wie folgt:
〈? Xml Version = "1.0" coding = "iso-8859-1"?〉 〈! DocType web-apppublic "-// sun microsystems, Inc.//dtd Webanwendung 2.3 // en "" http://java.sun.com/dtd/web-app_2_3.dtd "> 〈web-app> 〈Servlet> 〈Servlet-Name> hochladen 〈/servlet-name> 〈Servlet-Class> hochladen 〈/s Ervlet-Klasse> 〈Servlet-Mapping 〈Servlet-name> hochladen 〈/servlet-name> 〈url-puftern〉/fileUpload 〈/url-pufter 〈/servlet-mapping 〈/web-App 〈
Starten Sie nach dem Konfigurieren des Servlets Tomcat und schreiben Sie einen einfachen HTML -Test:
〈Form action = "fileUpload" methode = "post" engType = "multiPart/Form-data" name = "Form1"> 〈input type = "Datei" name = "Datei"> 〈Eingabe type = "name =" name = "value =" upload "> 〈/Form>
Hinweis Action = "FileUpload" wobei FileUpload das bei der Konfiguration des Servlets angegebene URL-Muster ist.
Hier ist der Code für eine Garnele:
Dieser Upload ist viel einfacher zu bedienen als SmartUpload. Es wurde vollständig von mir Bytes erstellt, im Gegensatz zu SmartUpload mit vielen Fehler.
Aufrufmethode:
Upload up = new Upload (); up.init (Anfrage); /** kann setSavedir (String Savedir) aufrufen; Setzen Sie den Speicherpfad und den Anruf setMaxFileSize (lange Größe), um das maximale Byte der hochgeladenen Datei festzulegen. Rufen Sie settagFileName (String) auf, um den Namen der Datei nach dem Upload (nur für die erste Datei gültig)*/up festzulegen. UploadFile ();
Dann string [] names = up.getFileName (); Holen Sie sich den Namen der hochgeladenen Dateinamen, der absolute Pfad der Datei sollte sein
Saved Directory Savedir+"/"+Namen [i];
Sie können den hochgeladenen Text oder up.getParameterervalues ("eingereicht") durch up.getParameter ("Feld") erhalten;
Holen Sie sich die Werte von Feldern mit demselben Namen wie mehreren Kontrollkästchen.
Probieren Sie die anderen selbst aus.
Der Quellcode lautet wie folgt: __________________________________________________________________
Paket com.inmsg.beans; import Java.io.*; import Java.util.*; Javax.servlet importieren.*; importieren javax.servlet.http.*; öffentliche Klasse Upload {private String savedir = ". // Pfad zum Speichern der Datei Private String contentType = ""; // Dokumenttyp private Zeichenfolge charset = ""; // Zeichen set private arrayList tmpfilename = new ArrayList (); // Temporäre Datenstruktur zum Speichern von Dateinamen private Hashtable Parameter = new Hashtable (); // Datenstruktur, die Parameternamen und Werte private ServletContext -Kontext speichert; // Programmkontext, verwendet, um die private HTTPServletRequest -Anfrage zu initialisieren; // Instanz, die verwendet wird, um in Anforderungsobjekt private String boundary = "" zu übergeben; // Speicherdatenabtrennungsabtrennung private int len = 0; // Byte Länge tatsächlich jedes Mal von der inneren privaten String -QueryString aus dem Inner gelesen; private Int Count; // Gesamtzahl der hochgeladenen Dateien private Zeichenfolge [] Dateiname; // Hochgeladene Dateiname Array private long maxFileSize = 1024 * 1024 * 10; // Maximale Datei -Upload -Bytes; private String tagFileName = ""; public final void init (httpServletRequest Anfrage) löst ServletException {this.request = request; bloße = request.getContentType (). substring (30); // Erhalten Sie die In-Memory-Daten Delimiter queryString = request.getQueryString (); } public String getParameter (String s) {// verwendet, um den Parameterwert des angegebenen Feldes zu erhalten, überschreiben Sie. } return (string) parameter.get (s); } public String [] getParameterValues (String s) {// verwendet, um das mit demselbe Namen angegebene Parameter -Array zu erhalten, überschreiben Sie Request.GetParametervalues (String S) ArrayList al = new ArrayList (); if (parameter.isempty ()) {return null; } Enumeration e = parameter.keys (); while (e.hasmoreElements ()) {String key = (string) e.NextElement (); if (-1! }} if (al.size () == 0) {return null; } String [] value = new String [al.size ()]; für (int i = 0; i 〈value.length; i ++) {value [i] = (string) al.get (i); } Rückgabewert; } public String getQueryString () {return queryString; } public int getCount () {return count; } public String [] getFileName () {return Dateiname; } public void setMaxFileSize (lange Größe) {maxFileSize = Größe; } public void settagFileName (String Dateiname) {TagFileName = Dateiname; } public void setSavedIr (String SARSEDIR) {// Setzen Sie den Pfad, um das Hochladen der Datei this.savedir = savedir zu speichern; Datei testDir = neue Datei (SAREDIR); // Um sicherzustellen, dass das Verzeichnis existiert, erstellen Sie das Verzeichnis if (! Testdir.exists ()) {testDir.mkdir (); }} public void setCharSet (String charSet) {// Setzen Sie den Zeichen set this.charset = charSet; } public boolean uploadFile () löst ServletException aus, iOException {// Upload -Methode, die vom Benutzer setCharSet (Request.GetaracacterenCoding ()) aufgerufen wird; uploadfile zurückgeben (request.getInputStream ()); } private boolean uploadfile (servletInputStream servletInputStream) Ausläuft // Die Hauptmethode zum Erhalten zentraler Speicherdaten ServletException, IOException {String line = null; byte [] buffer = neues byte [256]; while ((line = readline (buffer, servletInputStream, charSet))! = null) {if (line if (i〉 = 0) {// Wenn es in der Beschreibung in einem Trenngeber fileName = gibt, bedeutet dies, dass es sich um den codierten Inhalt der Datei string fname = getFileName (Zeile) handelt. if (fname.equals ("")) {Fortsetzung; } if (count == 0 && tagFileName.length ()! = 0) {string ext = fname.substring ((fname.lastIndexof (".") + 1)); fname = tagFileName + "." + ext; } tmpfilename.add (fname); zählen ++; while ((line = readline (buffer, servletInputStream, charset))! = null) {if (line.length () 〈= 2) {break; }} Datei f = neue Datei (SARDEDIR, FNAME); FileOutputStream dos = new FileOutputStream (f); lange Größe = 0L; while ((line = readline (buffer, servletInputStream, null))! = null) {if (line.indexof (grenze)! } Größe += len; if (Größe〉 maxFileSize) {neue IOException ("Datei überschreitet" + maxFileSize + "Byte!"); } dos.write (buffer, 0, len); } dos.close (); } else {// ansonsten ist es der Inhalt des Felds Codierungsstring von Key = getKey (Zeile); String value = ""; while ((line = readline (buffer, servletInputStream, charset))! = null) {if (line.length () 〈= 2) {break; }} while ((line = readline (buffer, servletInputStream, charSet))! = null) {if (line.indexof (grenze)! } Wert += Zeile; } put (Schlüssel, value.trim (), Parameter); }}} if (queryString! = null) {string [] jeder = split (querystring, "&"); für (int k = 0; k 〈Ever. if (nv.length == 2) {put (nv [0], nv [1], Parameter); }}} Dateiname = new String [tmpfilename.size ()]; für (int k = 0; k 〈Dateiname // Gießen Sie den temporären Dateinamen in ArrayList in die Daten, damit der Benutzer} if (Dateiname.length == 0) {false zurückgeben; // Wenn Dateiname -Daten leer sind, bedeutet dies, dass keine Datei hochgeladen wird} Return True; } private void put (String -Schlüssel, Stringwert, Hashtable ht) {if (! ht.containsKey (Schlüssel)) {ht.put (Schlüssel, Wert); } else {// Wenn Sie bereits einen Schlüssel mit demselben Namen haben, müssen Sie den aktuellen Schlüssel umbenennen. Achten Sie gleichzeitig vor, nicht denselben Namen wie der Schlüssel zu bilden. // Um nicht zwei identische Schlüssel in derselben MS} catch zu generieren (Ausnahme E) {} Key += "||||||||||| + System.currentTimemillis (); ht.put (Schlüssel, Wert); }}/* Aufrufen servletInputStream.readline (byte [] b, int offset, Länge) Methode, die eine Zeile aus dem ServletInputStream -Stream zum angegebenen Byte -Array liest. Um sicherzustellen, dass es eine Linie aufnehmen kann, sollte das Byte [] b nicht weniger als 256 sein. In der umgeschriebenen Readline wird eine Mitgliedsvariablen -Len zur tatsächlichen Anzahl der gelesenen Bytes gerufen (einige Zeilen sind weniger als 256). Beim Schreiben des Dateiinhalts sollte das Byte der Len -Länge aus dem Byte -Array anstelle der gesamten Länge von Byte [] geschrieben werden. Die umgeschriebene Methode gibt die Zeichenfolge jedoch zurück, um den tatsächlichen Inhalt zu analysieren, und kann Len nicht zurückgeben. Daher wird Len als Mitgliedsvariable festgelegt und die tatsächliche Länge bei jedem Lesevorgang dem Lesen zuweisen. Das heißt, bei der Verarbeitung des Inhalts der Datei müssen die Daten in Form von String zurückgegeben werden, um die Start- und Endmarken zu analysieren und gleichzeitig in Form von BYTE [] in den Dateiausgabestream geschrieben zu werden. */private String readline (byte [] lineByte, servletInputStream servletInputStream, String charset) {try {len = servletInputStream.readline (lineByte, 0, lineByte.length); if (len == -1) {return null; } if (charset == null) {return New String (lineByte, 0, len); } else {neuer String zurückgeben (lineByte, 0, len, charset); }} catch (Ausnahme _ex) {return null; }} private String getFileName (String -Zeile) {// trennen Sie den Dateinamen in der Beschreibung Zeichenfolge if (line == null) {return ""; } int i = line.indexof ("Dateiname ="); line = line.substring (i + 9) .trim (); i = line.lastIndexof (""); if (i 〈0 || i〉 = line.length () - 1) {i = line.lastIndexof ("/"); if (line.equals ("" "")) {return ""; } if (i 〈0 || i〉 = line.length () - 1) {return line; }} return line.substring (i + 1, line.length () - 1); } private String getKey (String -Zeile) {// trennen Sie den Feldnamen in der Beschreibung String if (line == null) {return ""; } int i = line.indexof ("name ="); line = line.substring (i + 5) .trim (); return line.substring (1, line.length () - 1); } public static String [] split (String Strob, String Mark) {if (strob == null) {return null; } StringTokenizer ST = new StringTokenizer (Strob, Mark); ArrayList tmp = new ArrayList (); while (St.Hasmoretokens ()) {tmp.add (St.NextToken ()); } String [] strarr = new String [tmp.size ()]; für (int i = 0; i 〈tmp.size (); i ++) {strarr [i] = (string) tmp.get (i); } return Strarr; }} Download ist eigentlich sehr einfach. Solange Sie es wie folgt verarbeiten, tritt kein Problem auf. public void download (String filepath, httpServletResponse -Antwort, boolean isonline) löst Ausnahme aus {Datei f = neue Datei (Filepath); if (! zurückkehren; } BufferedInputStream BR = new BuferedInputStream (neuer FileInputStream (f)); byte [] buf = neues byte [1024]; int len = 0; response.reset (); // Es ist sehr wichtig, wenn (iSOnline) {// ononopen Methode URL u = new URL ("Datei: ///"+filepath); response.setContentType (U.OpenConnection (). getContentType ()); response.setheader ("Inhaltsdisposition", "Inline; Dateiname ="+f.getName ()); // Der Dateiname sollte als UTF-8} else {// reine Download-Methode-Antwort codiert werden. response.setheader ("Inhaltsdisposition", "Anhang; Dateiname =" + f.getName ()); } OutputStream out = response.getOutputStream (); while ((len = br.read (buf))〉 0) out.write (buf, 0, len); Br.CLOSE (); out.close (); }