Bei der Entwicklung des Webanwendungssystems werden Datei -Upload- und Downloadfunktionen sehr häufig verwendete Funktionen. Lassen Sie uns heute über die Implementierung des Datei -Uploads und Herunterladen von Funktionen in Javaweb sprechen.
Datei -Upload -Übersicht
1. Die Funktion des Datei -Uploads
Zum Beispiel Netzwerkfestplatte! Es wird zum Hochladen und Herunterladen von Dateien verwendet.
Um einen vollständigen Lebenslauf zur Zhilianischen Rekrutierung auszufüllen, müssen Sie auch Fotos hochladen.
2. Anforderungen für das Hochladen von Seite
Es gibt viele Anforderungen für das Hochladen von Dateien. Denken Sie bitte daran:
Das Formular muss verwendet werden, keine Hyperlink -Formmethode muss posts
Der EncTeTepe der Form muss mehrteilig/formdaten sein
Fügen Sie das Feld Dateiformular im Formular hinzu, d. H. <Eingabe type = "Datei" name = "xxx"/>
<form action = "$ {pageContext.request.contextPath}/fileUploadServlet" methode = "post" engTePe = "MultiPart/Form-Data"> Benutzername: <Eingabe type type = "text" name = "username"/<br/> Datei 1: <eingabe type = "Datei" Datei "Datei" Datei "Datei" Datei ". name = "file2"/> <br/> <Eingabe type = "surenden" value = "sureichen"/> </form>3. Vergleichen Sie den Unterschied zwischen Datei -Upload -Formular und normalem Textformular
Zeigen Sie den Unterschied zwischen "Datei -Upload -Formular" und "normales Textformular" über httpwatch an.
Der EngeTepe des Datei-Upload-Formulars = "MultiPart/Form-Data", der mehrteilige Formulardaten darstellt;
Normale Textformulare können festgelegt werden, ohne das EngeTPE -Attribut festzulegen:
Wenn method = ”post” ist, ist der Standardwert von EnCTPE die Anwendung/x-www-form-urlencoded, was bedeutet, dass bei der Verwendung von Methode = „GET“ der Standardwert von EnCType null ist und kein Text besteht, sodass kein normales Textformular getestet werden muss:
<form action = "$ {pageContext.request.contextPath}/fileUploadServlet" methode = "post"> username: <input type = "text" name "nutzung value = "subieren"/> </form>Durch HTTPWatch -Tests, die sich mit dem Anforderungsdatenteil des Formulars befasst, haben wir festgestellt, dass nur der Dateinamen in der Anforderung, jedoch keinen Dateiinhalt enthält. Das heißt, wenn der EncTType des Formulars nicht mehrteilig/Form-Daten ist, enthält die Anforderung nicht den Dateiinhalt, sondern nur den Dateinamen, was bedeutet, dass es keinen Unterschied zwischen Eingabe: Datei und Eingabe: Text in einem normalen Textformular gibt.
Datei -Upload -Formular für das Datei hochladen:
<form action = "$ {pageContext.request.contextPath}/fileUploadServlet" methode = "post" engTePe = "MultiPart/Form-Data"> Benutzername: <Eingabe type type = "text" name = "username"/<br/> Datei 1: <eingabe type = "Datei" Datei "Datei" Datei "Datei" Datei ". name = "file2"/> <br/> <Eingabe type = "surenden" value = "sureichen"/> </form>Durch den HTTPWatch -Test sehen wir den Körperteil der Anforderungsdaten des Formulars an und stellten fest, dass der Körperteil aus mehreren Komponenten besteht. Jede Komponente entspricht einem Formularfeld, und jede Komponente verfügt über eigene Header -Informationen. Unterhalb der Header -Informationen befindet sich eine leere Zeile, und unterhalb der leeren Linie befindet sich der Körperteil des Feldes. Mehrere Teile werden durch zufällig erzeugte Trennwände getrennt.
Die Header-Informationen des Textfelds enthält nur eine Header-Informationen, nämlich Inhaltsdisposition. Der Wert dieser Headerinformationen hat zwei Teile. Der erste Teil ist festgelegt, nämlich Formdaten, und der zweite Teil ist der Name des Feldes. Hinter der leeren Linie befindet sich der Hauptteil, und der Hauptteil ist der in dem Textfeld ausgefüllte Inhalt.
Die Headerinformationen des Dateifelds enthält zwei Header, Inhaltsdisposition und Inhaltstyp. Es gibt einen zusätzlichen Dateinamen in der Inhaltsdisposition, wodurch der Name der hochgeladenen Datei angibt. Inhaltstyp gibt den Typ der hochgeladenen Datei an. Der Hauptteil des Dateifelds ist der Inhalt der Datei.
Bitte beachten Sie, dass die Dateien, die wir hochladen, alle normalen Textdateien sind, d. H. TXT -Dateien, sie können normalerweise in httpwatch angezeigt werden. Wenn die hochgeladenen Dateien exe, mp3 usw. sind, ist das, was Sie auf httpwatch sehen, verstümmelt.
4. Anforderungen für Servlets beim Hochladen von Dateien
Wenn das eingereichte Formular ein Datei -Upload -Formular ist, gibt es auch Anforderungen für das Servlet.
Zunächst müssen wir sicher sein, dass die Daten des Datei -Upload -Formulars auch in das Anforderungsobjekt eingekapselt sind.
Die Methode von Request.GetParameter (String) erhält den angegebenen Formularfeldzeicheninhalt, aber das Datei -Upload -Formular ist nicht mehr der Zeicheninhalt, sondern der Byte -Inhalt, sodass sie ungültig ist.
Zu diesem Zeitpunkt können Sie die Anforderung Methode getInputStream () verwenden, um das ServletInputStream -Objekt zu erhalten. Es ist eine Unterklasse von InputStream. Dieses ServletInputStream -Objekt entspricht dem Körperteil der gesamten Form (vom ersten Teiler bis zum Ende), was die Daten im von uns benötigten Parsing -Stream anzeigt. Natürlich ist es eine sehr mühsame Sache, es zu analysieren, und Apache hat uns Tools zur Verfügung gestellt, um es zu analysieren: Commons-fileUpload
Sie können versuchen, den Inhalt der Anfrage zu drucken.
public void dopost (httpServletRequest request, httpServletResponse -Antwort) löst ServletException aus, ioException {InputStream in = request.getInputStream (); String S = ioutils.toString (in); System.out.println (s);}--------------------------------- 7DDDD3370AB2Content-Disposition: Formdaten; Name = "Benutzername" Hallo ----------------------------- 7DDD3370AB2Content-Disposition: Form-Daten; name = "file1"; fileName = "a.txt" Inhaltstyp: Text/Plainaaa ----------------------------- 7DDD3370AB2Content-Disposition: Form-Data; name = "file2"; Dateiname = "B.Txt" Inhaltstyp: Text/PlainBBB ----------------------------- 7DDD3370AB2-
Commons-fileUpload
Warum verwenden Sie FileUpload:
Es gibt viele Anforderungen für das Hochladen von Dateien. Denken Sie bitte daran:
Muss eine Postform sein;
Der EncTeTepe der Form muss mehrteilig/formdaten sein;
Fügen Sie dem Formular des Dateiformulars zum Formular hinzu, d.h.
Servlet -Anforderungen:
Sie können Request.GetParameter () nicht mehr verwenden, um Formulardaten zu erhalten. Sie können Request.GetInputStream () verwenden, um alle Formulardaten anstelle der Daten eines Formularelements zu erhalten. Dies bedeutet, dass Sie keine DateiElpload verwenden. Wir müssen den Inhalt von Request.getInputStream () selbst analysieren.
1. Datei -pload -Übersicht
FileUpload ist eine Upload -Komponente, die von der Commons -Komponente von Apache bereitgestellt wird. Seine Hauptaufgabe ist es, uns bei der Analyse von Anfrage zu helfen.
Die von der FileUpload -Komponente erforderlichen JAR -Pakete sind:
Commons-fileUpload.jar, Kernpaket
Commons-io.jar, Abhängigkeitspaket
2. Einfache Anwendung von FileUpload
Die Kernklassen von FileUpload sind: diskFileItemFactory, ServletFileUpload, FileItem
Die Schritte zur Verwendung der FileUpload -Komponente sind wie folgt:
// 1. Erstellen Sie die Factory -Klasse diskfileItemFactory -ObjektdiskfileInTemfactory Factory = new diskFileItemfactory (); // 2. Erstellen Sie ein Parser -Objekt mithilfe des Werks ServletFileUpload FileUpload = new ServletFileUpload (Factory); // 3. Verwenden Sie den Parser, um die Anforderungsobjektliste <FileItem> list = FileUpload.ParSerequest (Request) analysieren zu können.
DiskFileItemFactory Disk Datei Element Factory Class
Public diskFileItemFactory (int Sizethreshold, Datei -Repository)
Geben Sie beim Erstellen einer Fabrik die Größe des Speicherpuffergröße und der temporären Speicherortdateispeicher an.
Öffentliche Void SetSizethreshold (int Sizethreshold)
Stellen Sie die Größe des Speicherpuffergröße für 10K fest
Public void setRepository (Dateirepository)
Setzen Sie den Speicherort temporärer Dateispeicher, Standard System.getProperty ("java.io.tmpdir").
Speicherpuffer: Beim Hochladen einer Datei wird der Inhalt der hochgeladenen Datei zuerst im Speicherpuffer gespeichert. Wenn die hochgeladene Dateigröße die Puffergröße überschreitet, werden temporäre Dateien auf der Serverseite generiert.
Temporärer Dateispeicherort: Laden Sie Dateien hoch, die die Größe des Speicherpuffergröße überschreiten, um temporäre Dateien zu generieren. Die temporären Dateien können über die Delete () -Methode von FileItem gelöscht werden
FileItem repräsentiert jeden Teil der Daten im Datei -Upload -Formular
Wir werden die FileItem -Klasse feierlich vorstellen, was das Endergebnis ist, das wir wollen. Ein FileItem -Objekt entspricht einem Formularelement (Formularfeld). Dateifelder und normale Felder existieren in einem Formular. Sie können die Methode isFormfield () der Datei -Item -Klasse verwenden, um festzustellen, ob das Formularfeld ein normales Feld ist. Wenn es sich nicht um ein normales Feld handelt, handelt es sich um ein Dateifeld.
HINWEIS: Da das Datei-Upload-Formular mit Multipart/Form-Data codiert wird und sich von der herkömmlichen URL-Codierung unterscheidet, können alle GetParameter () -Methoden keine SetCharaccode-() -Methoden verwenden () können das verstümmelte Problem der Eingabeelemente nicht lösen.
ServletFileUpload -Datei hochladen Kernklasse hochladen
3. Einfaches Upload -Beispiel
Schreiben Sie ein einfaches Upload -Beispiel:
Das Formular enthält ein Benutzernamefeld und ein Dateifeld.
Servlet speichert hochgeladene Dateien in das Uploads -Verzeichnis und zeigt den Benutzernamen, den Dateinamen, die Dateigröße und den Dateityp an.
Erster Schritt:
Um index.jsp zu vervollständigen, ist nur ein Formular erforderlich. Beachten Sie, dass das Formular postsiert werden muss und der Enctype mulitPart/form-Data sein muss
<form action = "$ {pageContext.request.contextPath}/fileUploadServlet" method = "post" engTePe = "MultiPart/Form-Data"> Benutzername: <input type = "text" name = "username"/<br/> Datei 1: <Eingabe type "Datei" Datei "Datei" Datei "Datei"/> </> </> </> </> </> </> <"/> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> value = "subieren"/> </form>Schritt 2: Füllen Sie FileUploadServlet aus
public void dopost (httpServletRequest Request, httpServletResponse-Antwort) löst ServletException aus, ioException {//, weil Sie mit der Antwort drucken möchten, seine codierende Antwort festlegen. // fabrikdiskfileItemfactory dfif = new diskFileItemfactory () erstellen; // Parser -Objekt mit Factory ServletFileUpload FileUpload = new ServletFileUpload (dfif) erstellen; Versuchen Sie {// Verwenden Sie das Parser -Objekt, um die Anforderung zu analysieren und die Liste der FileItem -Liste zu erhalten. // Alle Formularelemente für (FileItem FileItem: List) {// Wenn das aktuelle Formularelement ein normales Formularelement ist, if (FileItem.isformfield ()) {// Erhalten Sie den Feldname des aktuellen Formularelements Zeichenzeichenfeldname = FileItem.getfieldname (); // Wenn der Feldname des aktuellen Formularelements Benutzername ist, wenn (fieldname.equals ("username")) {// Den Inhalt des aktuellen Formularelements drucken, dh der von der Elemente -Elemente Antwort des Benutzername -Formulars eingegeben.getWriter (). Print ("Benutzername:" + FileItem.getString () + "<br/>"); }} else {// Wenn das aktuelle Formularelement kein Element für normales Formular ist, bedeutet dies, dass der Dateifeld String name = fileItem.getName (); // den Namen der hochgeladenen Datei abrufen // Wenn der Name des hochgeladenen Datei leer ist, wird keine hochgeladene Datei angegeben, wenn (Name == NULL || name.empty () {) {continaliert; } // Erhalten Sie den realen Pfad, der $ {Project Directory}/Uploads entspricht. Natürlich muss dieses Verzeichnis String SavePath = this.getServletContext (). GetRealPath ("/Uploads") haben; // Dateiobjekt über das Uploads -Verzeichnis und die Dateiname Datei Datei = neue Datei (SpeichernPath, Name) erstellen; // Speichern Sie die Upload -Datei in der angegebenen Speicherort -DateiItem.Write (Datei). // Drucken Sie den Namen der Antwort der Upload -Datei Antwort.getWriter (). Print ("Dateiname hochladen:" + name + "<br/>"); // Drucken Sie die Größe der Antwort der Upload -Datei Antwort.getWriter (). Print ("Dateigröße hochladen:" + fileItem.getSize () + "<br/>"); // Drucken Sie den Typ der hochgeladenen Dateiantwort.getWriter (). Print ("Dateityp hochladen:" + fileItem.getContentType () + "<br/>"); }}} catch (Ausnahme E) {neue servletException (e) werfen; }}Datei -Upload -Details
1. Stellen Sie die hochgeladene Datei in das Web-Inf-Verzeichnis ein
Wenn die vom Benutzer hochgeladenen Dateien nicht im Web-Inf-Verzeichnis gespeichert werden, kann der Benutzer über den Browser direkt auf die hochgeladenen Dateien zugreifen, was sehr gefährlich ist.
Wenn der Benutzer eine A.JSP -Datei hochlädt und der Benutzer über den Browser auf die A.JSP -Datei zugreift, wird der Inhalt in A.JSP ausgeführt. Wenn es in A.JSP: RunTime.getRuntime (). Exec ("Shutdown St 1") gibt; Dann wirst du ...
Normalerweise erstellen wir ein Uploads-Verzeichnis im Web-INF-Verzeichnis, um die hochgeladenen Dateien zu speichern. Um dieses Verzeichnis im Servlet zu finden, müssen wir die GetRealPath (String) -Methode des ServletContext verwenden. Beispielsweise gibt es in meinem Upload1 -Projekt die folgende Aussage:
ServletContext ServletContext = this.getServletContext (); String SavePath = ServletContext.getRealPath ("/webinf/Uploads");Der SavePath ist: f:/tomcat6_1/webapps/upload1/web-inf/uploads.
2. Dateiname (Vollständiger Pfad, Dateiname)
Der hochgeladene Dateiname kann der vollständige Pfad sein:
Der von IE6 erhaltene Dateinamen hochladen ist der vollständige Pfad, während der von andere Browsern erhaltene Dateinamen nur der Dateiname ist. Wir müssen uns noch mit dem Problem der Browserunterschiede befassen
String name = file1FileItem.getName (); Antwort.getWriter (). Print (name);
Mit verschiedenen Browsern zum Testen wird der IE6 den vollständigen Pfad zurückgeben, um die Datei hochzuladen. Ich weiß nicht, was IE6 tut, was uns viel Ärger bringt, nämlich mit diesem Problem umzugehen.
Es ist auch sehr einfach, dieses Problem zu lösen. Unabhängig davon, ob es sich um einen vollständigen Weg oder nicht, fangen wir den Inhalt nach dem letzten "/" einfach ab
String name = file1FileItem.getName (); int lastIndex = name.lastIndexof ("//"); // Holen Sie sich die Position des letzten "/" if (lastIndex! name = name.substring (lastIndex + 1); // den Dateinamen} response.getWriter (). print (name);3.. Chinesisch verstümmeltes Problem
Der hochgeladene Dateiname enthält Chinese:
Wenn der hochgeladene Name Chinese enthält, müssen Sie die Codierung festlegen. Die Commons-fileUpload-Komponente bietet uns zwei Möglichkeiten, die Codierung festzulegen:
Request.Setcharactercoding (String): Diese Methode ist die bekannteste Art und Weise, wie wir es sind.
FileUpload.SetheaDerencdoing (String): Diese Methode hat eine höhere Priorität als die vorherige
Der Dateiinhalt der hochgeladenen Datei enthält Chinese:
Normalerweise müssen wir uns nicht um den Inhalt des Hochladens von Dateien kümmern, da wir die hochgeladenen Dateien auf der Festplatte speichern! Mit anderen Worten, wie sieht die Datei aus und wie sie auf dem Server aussieht?
Wenn Sie jedoch eine solche Anforderung haben und die hochgeladenen Dateiinhalte auf der Konsole anzeigen müssen
Textdateiinhalt und Elemente in Normalformelementen Inhalt verwenden GetString ("UTF-8") der DateiItem-Klasse, um die Codierung zu verarbeiten.
4. Die Ausgabe des Hochladens Datei mit demselben Namen (Umbenennung von Dateien)
Normalerweise speichern wir die vom Benutzer hochgeladene Datei in das Uploads -Verzeichnis. Was ist jedoch, wenn der Benutzer eine Datei mit demselben Namen hochlädt? Dies führt zu einer Abdeckung. Die Methode, um dieses Problem zu lösen, besteht darin, die UUID zu verwenden, um einen eindeutigen Namen zu generieren und dann mit dem "_" den ursprünglichen Namen zu verbinden, der von der Datei hochgeladen wurde.
Die vom Benutzer hochgeladene Datei lautet beispielsweise "mein 1 -Zoll -Foto.jpg". Nach der Verarbeitung lautet der Dateiname: "891b3881395f4175b969256a3f7b6e10_My One Zoll foto.jpg". Diese Methode veranlasst nicht, dass die Datei ihre Erweiterung verliert. Aufgrund der Einzigartigkeit der UUID hat die hochgeladene Datei denselben Namen, aber auf der Serverseite wird es mit demselben Namen kein Problem geben.
public void dopost (httpServletRequest request, httpServletResponse-Antwort) löst ServletException aus, iOException {Request.Setcharactercoding ("UTF-8"); DiskFileItemFactory dfif = new diskFileItemFactory (); ServletFileUpload -DateiElpload = new ServLetFileUpload (dfif); try {list <FileItem> list = FileUpload.ParSerequest (Anfrage); // Erhalten Sie das Element der zweiten Formular, da das erste Formularelement Benutzername ist. Das zweite ist die Dateiformelement -Elemente FileItemeItem = list.get (1); String name = FileItem.getName (); // den Dateinamen abrufen // Wenn der Client IE6 verwendet, müssen Sie den Dateinamen vom vollständigen Pfad int lastIndex = name.lastIndexof ("//") abrufen. if (lastIndex! = -1) {name = name.substring (lastIndex + 1); } // Die hochgeladene Datei savePath = this.getServletContext () erhalten. GetRealPath ("/web-inf/uploads"); String uUid = CommonUtils.UUID (); // UUID String Dateiname = UUID + "_" + name; // Der neue Dateiname ist uUid + Unterstrich + Originalname // Erstellen eines Dateiobjektobjekts erstellen, und die hochgeladene Datei wird in der Datei -Datei -Datei -Datei -Datei, die Datei -Datei, die Datei -Datei, die Datei -Datei, die Datei -Datei, die Datei -Datei, die Datei -Datei, die Datei -Datei, die Datei -Datei, ///edename, gespeichert wird. Datei. // Datei item.write (Datei) speichern; } catch (Ausnahme E) {neue servleTexception (e) werfen; }}5. Ein Verzeichnis kann nicht zu viele Dateien speichern (das Verzeichnis speichern, um sich zu trennen).
In einem Verzeichnis sollten nicht zu viele Dateien gespeichert werden. Im Allgemeinen werden 1.000 Dateien in einem Verzeichnis gespeichert, und wenn es viele gibt, ist es beim Öffnen des Verzeichnisses sehr "cracky". Sie können versuchen, das Verzeichnis c:/window/system32 zu drucken, Sie werden es spüren
Das heißt, wir müssen die hochgeladenen Dateien in verschiedene Verzeichnisse einfügen. Ein Verzeichnis kann jedoch nicht für jede hochgeladene Datei verwendet werden, da diese Methode zu zu vielen Verzeichnissen führt. Wir sollten also einen Algorithmus verwenden, um sich zu trennen!
Es gibt viele Möglichkeiten, es zu trennen, z. B. die Verwendung von Daten, um es zu brechen und jeden Tag ein Verzeichnis zu erzeugen. Sie können auch den ersten Buchstaben des Dateinamens verwenden, um ein Verzeichnis zu generieren, und Dateien mit demselben Anfangsbuchstaben werden im selben Verzeichnis platziert.
DATE BREAKING -Algorithmus: Wenn an einem bestimmten Tag zu viele Dateien hochgeladen werden, gibt es auch zu viele Verzeichnisdateien.
Der Algorithmus zum Brechen des ersten Buchstabens: Wenn der Dateiname in Chinesisch ist, weil es zu viele Chinesen gibt, wird er zu zu vielen Verzeichnissen führen.
Wir verwenden den Hash -Algorithmus hier, um ihn aufzubrechen:
Holen Sie sich den HashCode des Dateinamens: int hCode = name.hashcode ()
Holen Sie sich die unteren 4 Bit HCODE und konvertieren Sie sie dann in hexadezimale Zeichen, um die 5 bis 8 Bit HCODE zu erhalten, und konvertieren Sie sie dann in hexadezimale Zeichen, um eine Verzeichniskette mit diesen beiden hexadezimalen Zeichen zu erzeugen. Zum Beispiel sind die unteren 4-Bit-Zeichen "5"
Der Vorteil dieses Algorithmus besteht darin, dass im Upload -Verzeichnis maximal 16 Verzeichnisse generiert werden und in jedem Verzeichnis 256 Verzeichnisse maximal 16 Verzeichnisse generiert werden, und alle hochgeladenen Dateien werden in diesen 256 Verzeichnissen platziert. Wenn die maximale Anzahl jedes Verzeichnisses 1000 Dateien beträgt, können insgesamt 256.000 Dateien gespeichert werden.
Beispielsweise lautet der Name des Upload -Dateins: Neues Textdokument. Wenn die unteren 4 Bit: 9 und 5 ~ 8 Bit 1 sind, ist der Dateisparpfad hochgeladen/9/1//
int hCode = name.hashcode (); // den Hashcode des Dateinamens abrufen // Die niedrigen 4 Bit von hCode abrufen und in die hexadezimale String -String -Dir1 = Integer.TohexString (HCode & 0xf); // Get das niedrige 5 ~ 8 -Bit von hcode und konvertieren Sie es in das Hexadecimal -String -String -String -String. >>> 4 & 0xf); // Schließen Sie den Dateispat zum vollständigen Pfad SavePath = SavePath + "/" + DIR1 + "/" + DIR2; // Weil dieser Pfad möglicherweise nicht vorhanden ist, erstellen Sie sie als Dateiobjekt und erstellen Sie dann eine Verzeichniskette, um sicherzustellen, dass das Verzeichnis bereits vor dem Speichern der Datei (SavePath) .Mkdirs () ();
6. Größenlimits für einzelne hochgeladene Dateien
Es ist sehr einfach, die Größe von hochgeladenen Dateien zu begrenzen, nur setFilesimax (lange) der ServletFileUpload -Klasse. Der Parameter ist die Obergrenze der Anzahl der Bytes der hochgeladenen Datei. Zum Beispiel bedeutet ServletFileUpload.SetFilesimemax (1024*10), dass die Obergrenze 10 kb beträgt.
Sobald die hochgeladene Datei die obere Grenze überschreitet, wird eine FileUploadbase.FilesizelimitexceedEdException -Ausnahme ausgeworfen. Wir können diese Ausnahme im Servlet und die Ausgabe "Hochgeladene Datei überschreiten die Limit" auf die Seite aus.
public void dopost (httpServletRequest request, httpServletResponse-Antwort) löst ServletException aus, iOException {Request.Setcharactercoding ("UTF-8"); DiskFileItemFactory dfif = new diskFileItemFactory (); ServletFileUpload -DateiElpload = new ServLetFileUpload (dfif); // Setzen Sie die obere Grenze der hochgeladenen Einzeldatei auf 10 -kB -DateiElpload.SetFilesimemax (1024 * 10); try {list <FileItem> list = FileUpload.ParSerequest (Anfrage); // Erhalten Sie das Element der zweiten Formular, da das erste Formularelement Benutzername ist, das zweite der Dateiformelement -Element FileItem = list.get (1); String name = FileItem.getName (); // den Dateinamen abrufen // Wenn der Client IE6 verwendet, müssen Sie den Dateinamen vom vollständigen Pfad int lastIndex = name.lastIndexof ("//") abrufen. if (lastIndex! = -1) {name = name.substring (lastIndex + 1); } // Die hochgeladene Datei savePath = this.getServletContext () erhalten. GetRealPath ("/web-inf/uploads"); String uUid = CommonUtils.uUid (); // uUid String Dateiname = UUID + "_" + name; // Der neue Dateiname ist uUid + Unterstrich + Originalname int hCode = name.hashCode (); // Erhalten Sie den Hashcode -Namen des Dateinamens // das untere 4 Bits von hcode und konvertieren Sie die unteren 4 Bits von hcode und konvertieren Sie die unteren 4 bits von hcodes und konvertieren in hexadecode von hexade des dateinnamens. Integer.tohexString (hCode & 0xf); // Die unteren 5 ~ 8 Bits HCode erhalten und in hexadezimale String -String -String -Dir2 = Integer.TohexString (HCODE >>> 4 & 0xF) umwandeln; // Verbinde den Dateispazierpfad in einen vollständigen Pfad SavePath = SavePath + "/" + dir1 + "/" + dir2; // Da dieser Pfad möglicherweise nicht vorhanden ist, erstellen Sie ein Dateiobjekt und erstellen Sie dann eine Verzeichniskette, um sicherzustellen, dass das Verzeichnis bereits vorhanden ist, bevor die neue Datei (SavePath) .Mkdirs () speichert. // Erstellen Sie ein Dateiobjekt, und die hochgeladene Datei wird in dem von dieser Datei angegebenen Pfad gespeichert // SavePath, dh das hochgeladene Datei speichern, // Dateiname, Dateiname, Dateiname; // DateiItem.Write (Datei) speichern; } catch (Ausnahme e) {// Bestimmen Sie, ob der Typ der geworfenen Ausnahme FileUploadBase.FileSizElimitexceedException // ist. Wenn ja, bedeutet dies, dass das Limit beim Hochladen der Datei überschritten wurde. if (e instanceof FileUploadBase.FilesizeelimitexceedEdException) {// Speichern Sie die Fehlermeldung in der Anfrageanforderung. // weiterhin an die Seite index.jsp weiterleiten! Auf der Seite von index.jsp müssen Sie $ {msg} verwenden, um die Fehlermeldungsanforderung anzuzeigen. zurückkehren; } neue servletException (e) werfen; }}7. Gesamtgrößengrenze für das Hochladen von Dateien
Das Formular zum Hochladen einer Datei kann es ermöglichen, dass mehrere Dateien hochgeladen werden, z. B.:
Manchmal müssen wir die Größe einer Anfrage einschränken. Das heißt, die maximale Anzahl von Bytes für diese Anfrage (Summe aller Formularelemente)! Das Implementieren dieser Funktion ist ebenfalls sehr einfach. Sie müssen nur die Methode SetSizemax (Long) der ServletFileUpload -Klasse aufrufen.
Beispielsweise loderaPload.setsizemax (1024 * 10);, die Obergrenze für die gesamte Anforderung beträgt 10 KB. Wenn die Anforderungsgröße 10 KB überschreitet, wirft die Parserequest () -Methode der ServletFileUpload -Klasse eine Datei -ploadBase aus.
8. Cache -Größe und temporäres Verzeichnis
Denken Sie darüber nach, wenn ich einen Blu-ray-Film hochladen, den Film zuerst in den Speicher speichern und dann durch den Speicher auf die Festplatte des Servers kopieren kann, kann Ihr Speicher gegessen werden?
Daher können die Datei -Pload -Komponente nicht alle Dateien im Speicher speichern. FileUpload wird feststellen, ob die Dateigröße 10 KB überschreitet. Wenn ja, speichern Sie die Datei auf der Festplatte. Wenn es nicht überschreitet, speichern Sie es im Speicher.
10 KB ist der Standardwert von FileUpload, wir können ihn festlegen.
Wenn die Datei auf der Festplatte gespeichert wird, speichert FileUpload die Datei im System Temporary Directory. Natürlich können Sie auch das temporäre Verzeichnis festlegen
public void dopost (httpServletRequest request, httpServletResponse-Antwort) löst ServletException aus, iOException {Request.Setcharactercoding ("UTF-8"); DiskFileItemFactory dfif = new diskFileItemFactory (1024*20, neue Datei ("f: // temp"); ServletFileUpload -DateiElpload = new ServLetFileUpload (dfif); try {list <FileItem> list = FileUpload.ParSerequest (Anfrage); FileItem FileItem = list.get (1); String name = FileItem.getName (); String SavePath = this.getServletContext (). GetRealPath ("/webinf/Uploads"); // save FileItem.Write (Pfad (Path (SavePath, Name));} catch (Exception E) {neue servleTexception (e);}} private Dateipfad (String SavePath, String Dateiname) {// den Dateinamen int int von der vollständigen Pfad lastIndex = fileName.lastIndexofEx ("//"). + 1); Datei (SavePath) .Mkdirs ();Datei herunterladen
1. Laden Sie 1 über Servlet herunter
Die heruntergeladenen Ressourcen müssen in das Web-Inf-Verzeichnis platziert werden (es ist in Ordnung, solange der Benutzer nicht direkt über den Browser zugreifen kann) und sie dann über das Servlet herunterladen.
Geben Sie den Hyperlink auf der JSP -Seite, den Link zum DownloadServlet und geben Sie den Dateinamen zum Herunterladen an. Anschließend erhält DownloadServlet den realen Pfad der Datei und schreibt die Datei in den Stream response.getOutputStream ().
download.jsp
<body> Dies ist meine JSP -Seite. <br> <a href = "<c: url value = '/downloadServlet? path = a.avi' //>"> a.avi </a> <br/> <a href = "<c: url value = '/downloadServlet? path = a.jpg' //>"> A.jpg </a> <br/> <a href value = '/downloadServlet? path = a.txt' ///> "> a.txt </a> <br/> </body>
DownloadServlet.java
public void dodget (httpServletRequest request, httpServletResponse -Antwort) löst ServletException aus, iOException {String fileName = request.getParameter ("Pfad"); String filepath = this.getServletContext (). GetRealPath ("/webinf/Uploads/" + Dateiname); Datei Datei = neue Datei (FilePath); if (! file.exists ()) {response.getWriter (). print ("Die Datei, die Sie herunterladen möchten, existiert nicht!"); zurückkehren; } Ioutils.copy (new FileInputStream (Datei), response.getOutputStream ());};Der obige Code hat die folgenden Probleme:
1. Sie können A.avi herunterladen, aber der Dateiname im Download -Feld ist DownloadServlet.
2. Sie können A.JPG und A.TXT nicht herunterladen, sondern sie auf der Seite anzeigen.
2. Laden Sie 2 über Servlet herunter
Lassen Sie uns im vorherigen Beispiel mit dem Problem umgehen, damit das Download -Feld den richtigen Dateinamen anzeigen kann und Sie A.JPG- und A.TXT -Dateien herunterladen können
Behandeln Sie das obige Problem durch Hinzufügen von Inhaltsdispositions-Header. Wenn der Header für die Inhaltsdisposition eingestellt ist, wird der Browser die Download-Box veröffentlicht
Und Sie können auch den Namen der heruntergeladenen Datei über den Inhaltsdisposition-Header angeben!
String Dateiname = Request.GetParameter ("Pfad"); String filepath = this.getServletContext (). GetRealPath ("/webinf/Uploads/" + Dateiname); Datei Datei = neue Datei (FilePath); if (! file.exists ()) {response.getWriter (). print ("Die Datei, die Sie herunterladen möchten, existiert nicht!"); zurückkehren; } response.addHeader ("Inhaltsdisposition", "Anhang; Dateiname =" + Dateiname); Ioutils.copy (neuer FileInputStream (Datei), response.getOutputStream ());Obwohl der obige Code bereits das Herunterladen von Dateien wie TXT und JPG verarbeiten und auch das Problem der Anzeige von Dateinamen im Download -Feld verarbeiten kann, kann er immer noch nicht in Chinesisch angezeigt
3. Laden Sie 3 über Servlet herunter
Unten finden Sie das Problem, die Anzeige von Chinesen in der Download -Box zu behandeln!
Tatsächlich ist diese Frage sehr einfach. Sie müssen nur Chinesen durch die URL codieren!
download.jsp
<a href = "<c: url value = '/downloadServlet? path = Dieser Killer ist nicht zu kalt. href = "<c: url value = '/downloadServlet? path = Beschreibung.txt'/>"> Beschreibung.txt </a> <br/>
DownloadServlet.java
String Dateiname = Request.GetParameter ("Pfad"); // In der Get -Anforderung enthält der chinesische Parameter die Chinesen und muss selbst konvertiert werden. // Natürlich, wenn Sie den "globalen Codierungsfilter" verwenden, müssen Sie sich hier nicht damit befassen. Datei (filepath); if (! File.exists ()) {response.getwriter (). Print ("Die Datei, die Sie herunterladen möchten, existiert nicht!"); return;} // Alle Browser verwenden die lokale Codierung, dh das chinesische Betriebssystem verwendet GBK // Nach dem Empfangen des Browsers diesen Dateinamen wird ISO-8859-1 verwendet, um Dateiname = new String (Filename.GetBytes ("GBK"), "ISO-8859-1" -Anname zu dekodieren. Dateiname); ioutils.copy (neuer FileInputStream (Datei), response.getOutputStream ());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.