Datei -Upload -Übersicht
Um die Datei -Upload -Funktion in der Webentwicklung zu realisieren, müssen Sie die folgenden zwei Schritte ausführen:
Addieren Sie die Onload -Eingabe in die Webseite
Lesen Sie die hochgeladenen Dateidaten im Servlet und speichern Sie sie auf der lokalen Festplatte.
Wie addiere ich Upload -Eingabelemente zu Webseiten?
Mit dem Tag <input type = "file"> wird die Webseite zum Hinzufügen von Datei -Upload -Eingabelementen hinzugefügt. Sie müssen darauf achten, wenn Sie bei der Einrichtung von Eingabelementen des Datei einsetzen:
1. Das Namensattribut des Eingangseingangselements muss festgelegt werden, andernfalls sendet der Browser die hochgeladenen Dateidaten nicht.
2. Der EngTYPE-Wert des Formulars muss auf Mehrfach-/Formdaten eingestellt werden. Nach dem Einstellen dieses Wertes wird die Dateidaten an die HTTP -Anforderungsnachrichtskörper angeschlossen, wenn der Browser die Datei hochlädt und das MIME -Protokoll verwendet, um die hochgeladene Datei zu beschreiben, um den Empfänger zu erleichtern, um die hochgeladenen Daten zu analysieren und zu verarbeiten.
Datei -Upload -Übersicht
Wie lese ich Datei -Hochladen von Daten im Servlet und speichern Sie sie auf der lokalen Festplatte?
Das Anforderungsobjekt bietet eine GetInputStream -Methode, über die vom Client übermittelte Daten gelesen werden können. Da Benutzer jedoch gleichzeitig mehrere Dateien hochladen können, ist es ein sehr problematischer Auftrag, die Upload -Daten direkt auf der Servlet -Seite zu lesen und die entsprechenden Dateidaten separat zu analysieren, Beispiele.
Um die Benutzer zum Verarbeiten von Datei-Upload-Daten zu erleichtern, bietet die Apache Open Source-Organisation eine Open-Source-Komponente (Commons-fileUpload), die zum Verarbeiten von Formulardatei-Uploads verwendet wird. Diese Komponente hat eine hervorragende Leistung und ihre API ist äußerst einfach zu verwenden, sodass Entwickler die Upload -Funktionen von Webdateien einfach implementieren können. Daher wird die Datei-Upload-Funktion normalerweise in der Webentwicklung implementiert, die normalerweise mit der Commons-FileUpload-Komponente implementiert wird.
Verwenden Sie die Commons-fileUpload-Komponente, um das Datei-Upload zu implementieren. Commons-io gehört nicht zur Development JAR-Datei für Datei-Upload-Komponenten, aber die Commons-fileUpload-Komponente beginnt mit Version 1.1 und erfordert Unterstützung durch das Commons-io-Paket, wenn es funktioniert.
FileUpload -Komponenten -Workflow
Kern -API - DiskfileItemFactory
DiskFileItemFactory ist die Fabrik, die FileItem -Objekte erstellt. Gemeinsame Methoden für diese Fabrikklasse:
öffentliche void setSizethreshold (int Sizethreshold): Legt die Größe des Speicherpuffer fest, der Standardwert ist 10k. Wenn die Upload -Datei größer als die Puffergröße ist, lädt die Datei -Pload -Komponente die Datei mit einem temporären Datei -Cache hoch.
public void setRepository (java.io.file repository): Geben Sie das temporäre Dateiverzeichnis an, der Standardwert ist System.getProperty ("java.io.tmpdir").
Public diskFileItemfactory (int Sizethreshold, Java.io.file Repository): Konstruktor
Kern -API - ServletFileUploadload
ServletFileUpload ist für die Verarbeitung hochgeladener Dateidaten verantwortlich und verkauft jedes Eingabelement im Formular in ein FileItem -Objekt. Gemeinsame Methoden sind:
boolean ismultiPartContent (HTTPServletRequest-Anforderung): Bestimmt, ob das hochgeladene Formular mit mehrteiliger/Formdaten-Typen ausgeladen ist
Listen Sie ParSerequest auf (HTTPServletRequest -Anforderung): Anlegen Sie das Anforderungsobjekt, wickeln Sie jedes Eingabelement in das Formular in ein FileItem -Objekt ein und geben Sie eine Listensammlung zurück, die alle DateiItems speichert.
setFilesizemax (Long Filesizemax): Legen Sie den Maximalwert von hochgeladenen Dateien fest
SETSIZEMAX (Long Sizemax): Legen Sie den Maximalwert der Gesamtzahl der hochgeladenen Dateien fest
setheaDerencoding (java.lang.String -Codierung): Setzen Sie das Codierungsformat
setProgressListener (ProgressListener Plistener)
Datei -Upload -Fall
Implementierungsschritte
1. Erstellen Sie ein diskFileItemFactory -Objekt, legen Sie die Puffergröße und das temporäre Dateiverzeichnis fest. 2. Verwenden Sie das DiskFileItemFactory -Objekt, um ein ServletFileUpload -Objekt zu erstellen, und legen Sie das Größenlimit für das Hochladen von Dateien fest.
A. Aufrufen ServletFileUpload.ParSerequest -Methode, um das Anforderungsobjekt zu analysieren und ein Listenobjekt zu erhalten, das alle hochgeladenen Inhalte speichert.
4. Iterieren Sie über die Liste. Jedes iteriert ein FileItem -Objekt und rufen Sie seine iSFormfield -Methode auf, um festzustellen, ob es sich um eine hochgeladene Datei handelt.
Es ist ein normales Formularfeld. Rufen Sie dann GetfieldName und GetString -Methoden auf, um den Feldnamen und den Feldwert zu erhalten
Um eine Datei hochzuladen, wird die GetInputStream -Methode aufgerufen, um den Dateneingangsstrom zu erhalten, wodurch die hochgeladenen Daten gelesen werden.
Codierung zum Implementieren des Datei -Uploads
Verarbeitung von Details zum Hochladen von Dateien
Chinesische Datei verstümmelt Problem
Das Problem des bekannten chinesischen Dateinamens, Sie können die SetheaDerencoding -Methode des ServletUploaders aufrufen oder die SetCharacacterencoding -Eigenschaft der Anfrage festlegen
Temporäres Löschungsproblem
Da die Dateigröße die Größe des von der diskFileItemfactory.SetSizSizethreshold-Methode festgelegten Speicherpuffer-Methode überschreitet, verwendet die Commons-Dateikomponente eine temporäre Datei, um die hochgeladenen Daten zu speichern. Nehmen Sie daher am Ende des Programms unbedingt die Methode "FileItem.Delete" auf, um die temporäre Datei zu löschen.
Der Anruf zur Löschmethode muss nach Abschluss des Streams erfolgen, andernfalls erfolgt die Dateiverwendung, was zum Löschfehler führt.
Dateispeicherort
Um die Sicherheit des Servers zu gewährleisten, sollten die hochgeladenen Dateien im Web-INF-Verzeichnis der Anwendung oder in einem vom Webserver nicht verwalteten Verzeichnis gespeichert werden.
Um zu verhindern, dass mehrere Benutzer Dateien mit demselben Dateinamen hochladen, was zu einer Dateiüberschreibung führt, sollte der Datei -Uploader sicherstellen, dass die hochgeladene Datei einen eindeutigen Dateinamen enthält.
Um zu viele Dateien in einem einzelnen Verzeichnis zu verhindern und die Geschwindigkeit des Lesens und des Schreibens von Dateien zu beeinflussen, sollte das Programm, das das Hochladen von Dateien verarbeitet, den entsprechenden Algorithmus zur Erzeugung von Verzeichnisstruktur basierend auf der Gesamtmenge möglicher Dateien -Uploads auswählen und die hochgeladenen Dateien auf verstreute Weise speichern.
Datei herunterladen
Da die zu heruntergeladene Datei von verschiedenen Typen sein kann, muss die Datei an den Client übertragen werden und der entsprechende Inhalt sollte als binär verarbeitet werden. Daher sollte die Methode aufgerufen werden, um das ServellToutputStream -Objekt zurückzugeben, um den Dateiinhalt an den Client zu schreiben.
Laden Sie den Fall herunter
Idieren Sie alle Dateien im Upload -Verzeichnis durch und zeigt sie dem Benutzer an und ermöglicht es dem Benutzer, den Download zu vervollständigen.
(Lesen Sie alle Dateien in einem bestimmten Ordner, speichern Sie sie in der Liste in der Sammlung und speichern Sie sie dann im Bereich der Anforderung.) ListFileServlt-(alle Dateien List anzeigen) ListFiles.jsp ---- DownloaServlet.javaprivate String-ID; private String Savename; // Der Name der Upload -Datei, den UUID -Namen der privaten Zeichenfolge Realname; // Der richtige Name der hochload -Datei private Zeichenfolge speichernPath; // Erinnere dich an den Ort der privaten Datei -Datumsüberzeit; // die Upload -Zeit der Datei private Zeichenfolge Beschreibung; // die Beschreibung des privaten String -Benutzernamens der Datei; // Der Uploader -ListfileServletPackage com.hbsi.servlet; import java.io.file; import Java.io.ioException; import Java.io.printwriter; import Java.util.hashmap; importieren; javax.servlet.http.httpServlet; importjavax.servlet.http.httpletRequest; importjavax.servlet.http.httpServletResponse; öffentliche Klasse ListFileVlet Extendshtplet {publicvoid doget (httpletrespletReple Antwort) ThrowsServletException, IOException {stringsavepath = this.getServletContext (). getRealPath ("/web-inf/upload"); mapmap = new HashMap (); Listfiles (newfile (SavePath),, map); request.setAttribute ("map", map); request.getRequestDispatcher ("/listfile.jsp"). Forward (Request, Antwort);} privateVoid listFiles (Dateidatei, Karte map) {if (Datei.isfile ()) {strituuidname = file.getname (); // uUid_a_1_3_3.txtstringRealname = uUidname.substring (uUidName.indexof ("_") + 1); map.put (uUidname, RealName);} else {Datei [] Datei = listFiles (); Dopost (HttpServletRequest -Anforderung, HttpServletResponse -Antwort) ThrowsServletException, IOException {dagget (Anfrage, Antwort);}} DownloadServletPackage com.hbsi.servlet; import Java.ioio.ioiox; java.io.printwriter; import java.net.urlencoder; import javax.servlet.servletException; import javax.servlet.http.httpServlet; importjavax.servlet.http.httpletRequest; public.Servlet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.httplet.http.httpletResponse; ExtendShttpServlet {publicVoid doget (httpServletRequest-Anforderung, HttpServletResponse-Antwort) ThrowsServletException, IOException {StringFileName = Request.GetParameter ("Filename"); Filename = new String (Filename.GetByTes ("ISO859-1"). "utf-8"); existieren "); request.getRequestDispatcher ("/message.jsp "). Forward (Request, Antwort);} Antwort byte [1024]; intlen = 0; outputStreamout = response.getOutputStream (); while ((len = in.read (buf))> 0) {out.write (buf, 0, len);} in (Dateiname.hashCode () >> 4) & 0xf; StringsavePath = this.getServletContext (). getRealPath ("/web-inf/Upload") + "//" + DIR1 + "//" + DIR2;} PublicString getRealname (String Filename) {StringRealname fileName.substring (Dateiname.indexof ("_") + 1); returnRealName;} publicVoid dopost (httpServletRequest Request, httpServletResponse -Antwort) ThrowsServletException, IOException {dodget (Anfrage, Antwort);}}}}}}}}}}}}}}}