Lassen Sie mich zunächst die relevanten Technologien vorstellen:
Zwei wichtige Parameter in der Servicemethode.
ServletRequest verwendet es, um Benutzeranfragen zu empfangen, und seine Funktion ist:
Eine seiner Subinterfaces: javax.servlet.http.httpServletRequest
ServletResponse wird verwendet, um Daten an den Benutzer zurückzugeben.
Eine seiner Subinterfaces: javax.servlet.http.httpserServletResponse
Datei -Download -Technologie:
Die Datei -Download -Technologie ist relativ einfach zu Datei -Upload -Technologie. Nehmen wir das Herunterladen von Bildern als Beispiel:
Durchsuchen Sie zuerst die Bilder und laden Sie sie dann herunter
1. Front-End-Code:
<span style = "Schriftgröße: 14px;"> <a href = "img"> Finden Sie alle Bilder unter dem Ordner </a> <br/> </span>
Die Rezeption kann in nur einem Satz erfolgen. Suchen Sie direkt nach Hintergrundprogrammen über Web.xml
2. Hintergrund -Anzeigecode:
<span style = "Schriftgröße: 14px;"> Public Class Showimg erweitert HttpServlet {public void dodget (httpServletRequest Request, httpServletResponse-Antwort) t ServletException, IOException {<span style = "White-Space: Pre"> </span> </span> </span> Dopost (Anfrage, Antwort); // Um Ausnahmen zu verhindern, Doget und Dopost miteinander zu verbinden. IoException {request.setcharactercoding ("utf-8"); "> <span style =" Schriftgröße: 14px; "> // <span style =" White-Space: pre "> </span> rufen Sie den ServletContext auf, natürlich können Sie es auch direkt nennen --- Wenn eins nach dem anderen aufgeführt ist, ist der absolute Pfad zur Datei erforderlich, wenn das Bild verwendet wird </span> ServletContext context = getServletContext (); String path = context.getRealPath ("/imgs"); // den absoluten Pfad der Ordnerdatei = neue Datei (Pfad); "> // <span style =" White-Space: PRE "> </span> Nach dem Befinden des Ordners finden Sie alle Bilder, in denen Benutzer String-Dateien durchsuchen können. oder String img = "<img src = 'imgs/"+fn+"'/>";
// out.print ("<a href = imgs/'"+fn+"'> Bild herunterladen </a>"); String str = "<a href = 'down? name = imgs/"+fn+"> Laden Sie das Bild herunter </a> "; // Geben Sie den Download-Hyperlink an, übergeben Sie den Parameter --- Übertragen ");}}
3. spezifischer Download von Dateien
Zunächst muss das entsprechende Protokoll festgelegt werden. Das Download -Protokoll erfordert das Einstellen des entsprechenden Download -Headers
<span style = "White-Space: PRE"> </span> <span style = "Schriftgröße: 18px;"> <strong> Antwort /Setzen Sie den entsprechenden Header </span>
Beim Herunterladen müssen Sie den Dateinamen des aktuellen Bildes anzeigen.
<span style = "Schriftgröße: 18px;"> <span style = "White-Space: PRE"> </span> outputStream out = response.getOutputStream (); // Erhalten Sie den Ausgabestream String Name = Reque st. GetParameter ("Name"); // Der aus dem Client -Dienst übergebene Parameter -Dienst ist int num = name.lastindexof ("/"); "UTF- 8"); // Wenn Chinesen wiederhergestellt werden müssen // System.out.println (AA); Strong> Anhang; Machen Sie einen bestimmten Download
<span style = "Schriftgröße: 18px;"> String Dateiname = this.getServletContext (). getRealPath (Name); // Erhalten Sie den absoluten Pfad, übergeben Sie den Dateinamen und übergeben Sie gleichzeitig den absoluten Pfad, den dieser Pfad übergeben kann erhalten werden und Sie können in = new FileInputStream (Dateiname) gelesen werden. {out.write (b, 0, len); Reproduktionsbild:
Das Rendering nach Klicken:
Der Dateiname ist anders
Datei -Upload -Technologie
Es wird sehr problematisch sein, Dateien selbst hochzuladen, damit wir das Paket eines anderen zum Herunterladen des Links verwenden und klicken, um das Linkformular zu öffnen:
Der Client muss den Datentyp Multipart/Form-Daten verwenden, um den zusammengesetzten Datentyp beim Senden von HTTP darzustellen.
Das heißt: <form engTepe = "Multipart/Form-Data">
Verwenden Sie das <eingabentyp = "Datei" name = "Somename"/> HTML -Tag im Formular.
Paket erforderlich:
Commons-fileUpload.jar, Das Core-Datei-Upload-Tool befindet sich in diesem Paket.
Commons-io.jar-Paket, das zum Hochladen von Dateien erforderlich ist
Detaillierte Erklärung:
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.
Hauptprozess:
Datei f = Neue Datei ("f:/ex/temp"); // Geben Sie den Speicherort der temporären Dateispeicher an
DiskFileItemFactory ff = new diskfileItemfactory (1024*1024*5, f); // Die Größe und Speicherort von temporären Dateien
ServletFileUpload sf = new ServletFileUpload (ff);
List <FileItem> list = sf.parsequest (Anfrage); // Analyse starten
für (FileItem it: Liste) {// Erhalten Sie den Dateinamen. Und verwenden Sie UUID, um das Problem doppelter Namen zu lösen
FileUtils.copyInputStreamToFile (it.getInputStream (), neue Datei (Pfad+"/"+Dateiname)); // im angegebenen Ordner geschrieben
}
1. Rezeption Code:
<span style = "Schriftgröße: 18px;"> <H2> Upload-Datei hochladen </H2> <Form Action = "Upfile" methode = "post" <span style = "color:#ff0000;"> engType = "MultiPart" /Form-Data "</span >> // Es muss geschrieben werden, da die Station keine Daten empfangen kann <!-dieses EncType =" MultiPart/Form-Data "---> Datei1 <Eingabe type =" Datei "<" <"< span style = "color:#ff6666;"> Name </span> = "Datei"/> <br/> Bitte geben Sie einen Namen ein: <Eingabe type = "text" <span style = "color:#ff6666;"> Name </span> = "Desc"/> <br/> Datei2 <Eingabe type = "Datei" <span style = "color:#ff6666;"> Name </span> = "Datei"/> <br/> Bitte geben Sie einen Namen ein: <Eingabe type = "text" <span style = "color:#ff0000;"> Name </span> = "Desc"/> <br/> <Eingabe type = "value =" subieren "/> </form> </span>
2. Hintergrundcode:
2-1 Erstellen Sie zunächst ein festes Festplattenfabrik, um temporäre Dateien zu speichern
// Geben Sie die temporäre Speicherortdatei f = Neue Datei an ("f:/ex/temp"); // Geben Sie den temporären Speicherort diskFileItemFactory ff = new diskfileTemfactory an (1024*1024*5, f); // Größe der Größe des Temporäre Datei- und Speicherort2-2 Erstellen Sie ein ServletFileUpload-Objekt und legen Sie die Dateigröße fest, um die Dateiübertragung zu maximieren
// Erstellen Sie ein Objekt zum Analysieren von ServletFileUpload sf = new ServletFileUpload (FF); *20);
2-3 Beginnen Sie mit dem Analyse des Objekts
<span style = "White-Space: PRE"> </span> list <FileItem> list = sf.parsequest (Anforderung); // Alle Informationen über die Rezeption übertragen, muss die Rezeption EncType = "Multipart" ausfüllen /Formular- Daten "für (FileItem it: list) {it0 = it; // <span style =" White-Space: pre "> </span> Wenn es sich um ein normales Formularobjekt handelt-können Sie direkt beurteilen, ob (( it.isformfield ()) {// Es handelt sich um ein normales Formular, z. +Name); // Unter dem Namen der Erläuterung geschrieben} else {<span style = "White-Space: PRE"> </span> // Dies ist der von der Anreg-Desk-String-Name = it.getName ausgewählte Dateiname (); // Der spezifische Dateipfad-Absolute Pfad // String str = it.getString (); // Inhalt in der Datei // system.out.println ("str"+str); .GetContType (); <pre name = "code" style = "font- Größe: 18px;"> // <span style = "White-Space: PRE"> </span> Der Ressourcendateiname auf der Serverseite kann nicht in Chinesisch sein, die Browser codiert es automatisch --------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------ Der Name der hochgeladenen Datei wird ohne chinesischen Speicher in einen Namen konvertiert. Der Mapping -Name muss gespeichert und dann beim Download des Benutzers zurück konvertiert werden. // Der Kartenname String id = uUid.randomuuid (). ToString (). Ersetzen ("-", ""); // Die einzige UUID der Welt wird für // Dateiname Zeichenfolge Lastname = name.substring (Name. lastIndexof (".")); // Dateiformat // Name Dateiformate werden gefunden --- Kombination String Dateiname = id+Lastname; // neuer Dateiname // Stream kopieren. Lassen Sie es in die entsprechenden Speicherort-Dateiutils.copyInputStreamtoFile (it.getInputStream (), neue Datei (Pfad+"/"+Dateiname)); // Pfad ist der absolute Pfad des Speichers-definierten vorherigen}
Dies kann einfache Uploads erreichen, aber diese Art von Upload ist überhaupt nicht sicher. Der vollständige Code ist mit geringfügigen Problemen beigefügt, um allgemeine Probleme zu vermeiden.
Nach Auswahl der Datei
Überprüfen Sie die Dateien auf dem Webserver -IMG. Die Datei wurde auf die Seite "Dateinamen generiert von UUID" hochgeladen.
Datei -Hochladen Quellcode:
<span style = "Schriftart Java .util.List; .APACHE .Commons.FileUpload.FileTem; Apache.Commons .io.FileUtils; Keine Antwort <span style = "White-Space: PRE;"> </span> @Override <span style = "White-Space: Pre;"> </span> Protected void degget (httpServletRequest req, http servletresponse resp) < span style = "White-Space: PRE;"> </span> löst ServletException aus, IoException {<span style = "White-Space: Pre;"> </span> resp.setContentType ("utf-8"); span style = "White-Space: PRE;"> </span> wr. resp.getwriter (); Unterstützt noch Upload-Methode "); <span style =" White-Space: Pre; "> </span>} <span style =" White-Space: Pre; "> </span> <span style =" White-Space : pre; "> </span> public void dopost (httpServletRequest-Anforderung, httpServletResponse-Antwort) <span style =" White-Space: PRE; "> </span> löst servletException, ioException {<span style =" White-Space aus: PRE; "> </span> Anfrage "); <span style =" White-Space: Pre; "> </span> printwriter out = response.getWriter (); <span style =" White-Space: Pre; "> <// Normale Formulare Upload-Methode 1: <span style = "White-Space: Pre;"> </span> // Rückgabewert Get (null) post1 (Apllication/x-form-rencodiert, normales Formular) Post 2 (Datei: Multipart/ Formular-, Datei-Upload-Formular) // <span style = "White-Space: PRE;"> </span> String type = request.getContentType (); > </span> if(!type.contains("mulitPart/form-data ")) {// <span style =" White-Space: PRE; "> </span> out.write (" Unterstützen Sie das Upload nicht der normalen Formen 2 "); // <span style =" White-Space: Pre; "> </span> return; // <span style =" White-Space: Pre; "> </span>} <span style = "White-Space: PRE;"> </span> // Methode 2 <span style = "White-Space: PRE;"> </span> boolean boo = servletFileUpload.ismultiPartContent (Anfrage); "White-Space: Pre;"> </span> if (boo == false) {<span style = "White-Space: Pre;"> </span> out.print ("Upload 1 der normalen Formulare ist nicht unterstützt "); <span style =" White-Space: PRE; "> </span> <span style =" White-Space: Pre; "> </span>} <span style =" White-Space: Pre; "> </span>} span> <span style =" White-Space: PRE; "> <// F = Neue Datei ("f:/ex/temp"); // Geben Sie den Speicherort der temporären Dateispeicher an <span style = "White-Space: PRE;"> </span> diskFileInfactory ff = new diskFileItemFactory (1024*1024* 5, f); // Temporäre Dateigröße und Speicherort <span style = "White-Space: Pre;"> </span> <span style = "White-Space: Pre;"> <// erstellen Ein Objekt für Parsing <span style = "White-Space: PRE;"> </span> ServletFileUpload sf = new servletFileUpload (ff); (1024*1024*10); // Der Maximalwert nur eines einzelnen Speicherorts beträgt 10 m <span style = "weißer Raum: pre;"> </span> /Der Maximalwert aller Dateien beträgt 20 m <span style = "White-Space: Pre;"> </span> String path = this.getServletContext (). GetRealPath ("/imgs"); Speicherplatz: PRE; "> </span> System.out.println (" Speicherpfad: "+Path); <span style =" White-Space: PRE; "> <// Spansing <span style = = "White-Space: Pre;"> </span> FileItem it0 = null; // verwendet temporäre Dateien in endlich <span style = "White-Space: PRE;"> </span> try {<span style = "White-Space: PRE;"> </span> list <FeigerItem> list = sf.parsequest (Anfrage); // Alle Informationen über die Rezeption übertragen. Die Rezeption muss EncType = "Multipart/Formular- Daten "<span style =" White-Space: PRE; "> </span> für (FileItem it: list) {<span style =" White-Space: Pre; "> </span> it0 = it; <span style = "White-Space: PRE;"> </span> if (it.isformfield ()) {// ist ein normales Formularelement, wie z. B. Typ = Textwert des Namens <span style = "weißer Raum: PRE ; "> </span> String name = it.getString (" utf-8 "); <span style =" White-Space: PRE; "> </span> System.out.println (" Basisformelementname: "+Name); // Unter dem Namen der Erklärung geschrieben ist <span style =" White-Space: Pre; "> </span>} else {<span style =" White-Space: Pre; "> </ Span> String name = it.getName ();//spezifischer Dateipfad // <span style = "White-Space: PRE;"> </span> String n1 = it.getFieldName (); "White-Space: PRE;"> </span> String str = it.getString (); // Der Inhalt in der Datei // <span style = "White-Space: PRE;"> </span> System. out.println ("st"+str); -Space: pre; "> </span> String contentType = it.getContentType (); <span style =" White-Space: PRE; "> </span> long Size = it.getSize (); <span style = "White-Space: Pre;"> </span> // verhindern die Datei von leer <span style = "White-Space: Pre;"> </span> if (size == 0) {<span style = " weißer Raum: Pre; "> </span> Weiter; // Die Datei ist leer, direkt zurückkehren; <span style =" White-Space: Pre; "> </span>} <span style =" White-Space : pre; "> </span> // Benutzername. Sie müssen <span style = "weißer Raum: pre;"> </span> if (name == null || name.trim () == "") {<span style = "White-Space: PRE ; "> </span> Fortsetzung; "White-Space: Pre;"> </span> System.out.println (Name+","+contentType+","+Größe); / Der Name der Ressourcendatei auf der Serverseite kann nicht auf Chinesisch sein, der Browser wird automatisch codieren ---------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------> </span> //, damit Benutzer beim Herunterladen ihren ursprünglichen Namen wiederherstellen können, müssen sie die Korrespondenz zwischen dem Original-Dateinamen und dem Mapping-Namen speichern und sie zurück konvertieren, wenn der Benutzer heruntergeladen wird. pre; "> </span> // Mapping-Name <span style =" White-Space: PRE; "> </span> String id = uUid.randomuuid (). toString (). Ersetzen ("-"," " ); (".")); </span> String Dateiname = ID+LastName; Lassen Sie es an den entsprechenden Ort schreiben. = "White-Space: PRE;"> </span>}} catch (FileUploadexception e) {<span style = "White-Space: PRE;"> </span> neue runTimeexception ("Datei-Upload-Parsing-Fehler." + e); span style = "White-Space: PRE;"> </span> it0.delete (); // Temporäre Datei löschen <span style = "White-Space: PRE;"> </span>}} out.close (close (() );}} </span> <span style = "Schriftgröße: 18px;"> </span> Datei-Download-Quellcode: [HTML] STIFE TRICECOPYPRINT? <span style = "Schriftgröße: 14px;"> Paket cn Servlet.ServletException; Antwortantwort) Würfe ServleTexcepti on, IOException {Dopost (Anfrage, Antwort); Senden Sie den Benutzernamen an die Rezeption/*Übertragen Sie die feste Benutzername-Zeichenfolge aa = "1.JPG"; // Wenn er in Chinesisch ist, müssen Sie aa = urlencoder.encode (aa, "utf-8") codieren. response.setheader ("content-Disposition", "Anhang; Dateiname = '"+aa+"'"); ///// müssen "Anhang" hinzufügen; ", sonst wird es zu einem Browsen*/outputStream out = Antwort. GetOutputStream (); // den Ausgabestream -String -Name = Anforderung erhalten. Substring (num+1); Disposition "," Anhang; Dateiname = '"+aa+"' "); // Erhalten Sie den Dateinamen von dort, sodass er beim Speichern von String Dateiname = this.getServletContext () heruntergeladen werden kann. GetRealPath (Name); // Den absoluten Pfad in Eingabe in = Neue Datei-Put-Stream (Dateiname); Write (B, 0, Len);}}} </span> <span style = "Schriftgröße: 18px;"> </span>Das Obige dreht sich alles um diesen Artikel, ich hoffe, es wird für das Lernen aller hilfreich sein.