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.
1. Laden Sie ein einfaches Beispiel hoch hoch
JSP
<%@ page Language = "java" import = "java.util. charset=UTF-8" /><title>File Upload and Download</title></head><body><form action="${pageContext.request.contextPath}/UploadServlet" enctype="multipart/form-data" method="post"> Upload user: <input type="text" name="username" /> <br /> Upload file 1: <input type="file" name = "file1" /> <br /> Datei hochladen 2: <Eingabe type = "Datei" name = "file2" /> <br /> <Eingabe type = "value =" upload " /> < /form> <br /> $ {RequestScope.message} < /body> < /html>Servlet
public void dodget (httpServletRequest Request, httpServletResponse -Antwort) löst ServletException aus, ioException {try {// 1. Holen Sie sich die Parser Factory diskFileItemFactory Factory = new diskFileItemfactory (); // 2. Holen Sie sich den Parser ServletFileUpload Upload = new ServletFileUpload (Fabrik); // 3. Bestimmen Sie die Art des Hochladensformulars if (! Upload.ismultipartContent (Anfrage)) {// Das hochladen Das Formular ist ein normales Formular, dann die Daten auf herkömmliche Weise und kehren Sie zurück. } // Um ein Formular hochzuladen, wird der Parser aufgerufen, um die hochload -Datenliste <FileItem> list = Upload.ParSequest (Anfrage) zu analysieren. // fileItem // die Liste transipulieren, um das erste Objekt des ersten Eingabelementelements für (FileItem item: list) {if (item.formfield ()) {// Was Sie erhalten, ist der normale Eingangselement -String -Name = item.getfieldname (); // Erhalten Sie den Namen des Eingabelement -String -Zeichens = item.getString (); System.out.println (Name + "=" + Wert); } else {// abrufen Sie das Upelad -Eingangselement String mateiname = item.getName (); // Hochgeladene Dateiname C:/Dokumente und Einstellungen/ThinkPad/Desktop/1.Txt Dateiname = Dateiname.substring (Dateiname.lastindexof ("//")+1); InputStream in = item.getInputStream (); // Hochgeladene Daten int len = 0; Byte Buffer [] = neues Byte [1024]; // Das zum Speichern von hochgeladene Dateien verwendete Verzeichnis sollte die äußere Welt daran hindern, direkt auf String SavePath = this.getServletContext () zugreifen zu können. GetRealPath ("/webinf/Upload"); System.out.println (SavePath); FileOutputStream out = new FileOutputStream (SAVEPATH + "/" + Dateiname); // Datei in das Upload -Verzeichnis schreiben, während ((len = in.read (puffer))> 0) {out.write (Buffer, 0, len); } in.close (); out.close (); Request.SetAttribute ("Nachricht", "Erfolg hochladen"); }}}} catch (exception e) {request.setAttribute ("message", "upload fehlgeschlagen"); E. printstacktrace (); }}2. Modifizierte Upload -Funktion:
Anmerkungen:
1. Chinesischer verstümmelter Code zum Hochladen von Dateinamen und chinesischem verstümmelten Code zum Hochladen von Daten
upload.SetheaDerencoding ("utf-8"); // Lösen Sie den chinesischen verstümmelten Code zum Hochladen von Dateinamen
// Das Formular wird für die Datei hochgeladen, die Anforderungscodierung ist ungültig und kann nur manuell konvertiert werden
1.1 value = new String (value.getBytes ("ISO8859-1"), "UTF-8");
1.2 String value = item.getString ("utf-8");
2. Um die Sicherheit des Servers zu gewährleisten, sollten Upload -Dateien in Verzeichnissen platziert werden, auf die von der Außenwelt nicht direkt zugegriffen werden kann.
3. Um das Überschreiben von Dateien zu verhindern, muss ein eindeutiger Dateiname zum Hochladen der Datei generiert werden.
4. Um zu verhindern, dass zu viele Dateien unter einem Verzeichnis angezeigt werden, müssen Sie den Hash -Algorithmus verwenden, um den Speicher aufzubrechen.
5. Um den Maximalwert von hochgeladenen Dateien zu begrenzen, können Sie die Methode: ServletFileUpload.SetFilesimax (1024) verwenden und erfassen:
FileUploadbase.FilesizeLimitexceedException-Ausnahme, um benutzerfreundliche Eingabeaufforderungen zu erhalten
6. Wenn Sie sicherstellen möchten, dass die temporäre Datei gelöscht wird, müssen Sie nach der Verarbeitung der Upload -Datei das Element.Delete -Methode aufrufen.
7. Um den Typ der hochgeladenen Datei einzuschränken: Wenn Sie den Namen der hochgeladenen Dateinamen erhalten, sollten Sie feststellen, ob der Suffix -Name legal ist.
8. Hören Sie sich den Fortschritt des Datei hochladen:
ServletFileUpload upload = new ServletFileUpload (fabrik); Upload.SetProgressListener (neuer progresorListener () {public void update (Long pByTesRead, Long pcontentLength, int arg2) {System.out.println ("Dateigröße ist:" + pcontentLength + ", derzeit verarbeitet:" + pByTesRead); 9. Fügen Sie dynamisch Datei -Hochladen Eingabelemente in der Webseite hinzu
Funktion addInput () {var div = document.getElementById ("Datei"); var input = document.createelement ("Eingabe"); input.type = "Datei"; input.name = "Dateiname"; var del = document.createelement ("Eingabe"); del.type = "button"; del.value = "delete"; del.onclick = function d () {this.parentnode.parentnode.removechild (this.parentnode); } var innerdiv = document.createelement ("div"); Innerdiv.AppendChild (Eingabe); Innerdiv.AppendChild (Del); Div.AppendChild (Innerdiv); }JSP hochladen:
<%@ page Language = "java" import = "java.util. addInput () {var div = document.getElementById ("Datei"); var input = document.createelement ("Eingabe"); input.type = "Datei"; input.name = "Dateiname"; var del = document.createelement ("Eingabe"); del.type = "button"; del.value = "delete"; del.onclick = function d () {this.parentnode.parentnode.removechild (this.parentnode); } var innerdiv = document.createelement ("div"); Innerdiv.AppendChild (Eingabe); Innerdiv.AppendChild (Del); Div.AppendChild (Innerdiv); } </script> </head> <body> <Form Action = "" engType = "mutliPart/Form-Data"> </form> <table> <tr> <td> Benutzer hochladen: </td> <td> <Eingabe-Typ = "text" name = "username"> </td> </tr> <tr> <td> bog ": Upload -Datei "onclick =" addInput () "> </td> </tr> <tr> <td> </td> <td> <div id =" Datei "> </div> </td> </td> </tr> </table> </body> </html>> </td> </tr> </table> </html>Laden Sie Servlet hoch
Public Class UploadServlet1 erweitert HttpServlet (public void dodget (httpServletRequest Request, httpServletResponse -Antwort). // **** Fehleranforderung. // Das Formular wird für die Datei hochgeladen, und die Anforderungscodierung ist ungültig. try {diskFileItemFactory factory = new diskFileItemFactory (); factory.setRepository (neue Datei (this.getServletContext (). getRealPath ("/web-inf/temp"))); ServletFileUpload upload = new ServletFileUpload (fabrik); /* upload.setProgressListener(New progresorListener () {public void update (Long pByTesRead, Long pcontentLength, int arg2) {System.out.println ("Dateigröße ist:" + pcontentLength + ", derzeit verarbeitet:" + pBytesRead);}}); // Lösen Sie den chinesischen verstümmelten Code zum Hochladen von Dateinamen if (! Upload.ismultipartContent (Anfrage)) {// Daten auf herkömmliche Weise abrufen; } /* upload.setFilesimemax(1024); upload.setsizemax (1024*10);*/ list <Dateinitem> list = upload.ParSerequest (Anfrage); für (FileItem item: list) {if (isformfield ()) {// Die Daten der gewöhnlichen Eingabedelemente werden im DateiItem -String -Name = item.getFieldName () eingekapselt; String value = item.getString ("utf-8"); // value = new String (value.getBytes ("ISO8859-1"), "UTF-8"); System.out.println (Name + "=" + Wert); } else {// Die Upload -Datei ist in der FileItem String Dateiname = item.getName () eingekapselt; // Die von verschiedenen Browsern eingereichten Dateien sind unterschiedlich c: /a/b/1.txt 1.txt system.out.println (Dateiname); if (Dateiname == null || fileName.trim (). Equals ("")) {Fortsetzung; } Dateiname = Dateiname.substring (Dateiname.lastIndexof ("//")+1); InputStream in = item.getInputStream (); String SaveFileName = MakefileName (Dateiname); // Erhalten Sie den Namen der Datei gespeichert String realSavePath = makePath (SaveFileName, SavePath); // Die Datei speichern Verzeichnis DateiOutputStream out = new FileOutputStream (RealSavePath + "//" + SaveFileName); Byte Buffer [] = neues Byte [1024]; int len = 0; while ((len = in.read (puffer))> 0) {out.write (puffer, 0, len); } in.close (); out.close (); item.delete (); // Temporäre Datei löschen}}} catch (FileUploadBase.FilesizelimitexceedException e) {e.printstacktrace (); Request.SetAttribute ("Nachricht", "Die Datei überschreitet den Maximalwert!!"); Request.GetRequestDispatcher ("/message.jsp"). Weiterleiten (Anfrage, Antwort); zurückkehren; } catch (Ausnahme e) {e.printstacktrace (); }} public String makefileName (String -Dateiname) {//2.jpg return uUid.randomuuid (). toString () + "_" + Dateiname; } public String makePath (String -Dateiname, String SavePath) {int HashCode = Dateiname.hashCode (); Int Dir1 = HashCode & 0xf; // 0--15 int dir2 = (HashCode & 0xf0) >> 4; // 0-15 String Dir = SavePath + "//" + dir1 + "//" + dir2; // Upload/2/3 Upload/3/5 Datei Datei = neue Datei (DIR); if (! file.exists ()) {file.mkdirs (); } return dir; } public void dopost (httpServletRequest Request, httpServletResponse -Antwort) löst ServletException aus, ioException {dodget (request, response); }}3. Download -Funktion
// Auflisten Sie alle Download-Dateien auf der Website der Website öffentlichklasse ListFileServlet erweitert HttpServlet (public void dagget (httpServletRequest), httpServletResponse-Antwort aus, die servleTexception, ioException {String filepath = this.getServletContext (). Map map = new HashMap (); ListFile (neue Datei (Filepath), Karte); Request.SetatTribute ("Karte", Karte); request.getRequestDispatcher ("/listfile.jsp"). Forward (Request, Antwort); } public void listFile (Dateidatei, Karte Karte) {if (! file.isfile ()) {Datei -Dateien [] = file.listfiles (); für (Datei f: Dateien) {listFile (f, map); }} else {string realname = file.getName (). substring (file.getName (). indexof ("_")+1); //9349249849-88343-8344_a_fan_davi.avi map.put (Datei.getName (), RealName); }} public void dopost (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, IOException {dodget (request, response); }}JSP -Anzeige
<%@ page Language = "java" import = "java.util. Transitional // en "> <html> <kopf> <titels> my jsp 'listFile.jsp' Startseite </title> </head> <body> <c: foreach var =" me "items =" $ {map} "> <c: url value ="/servlet/downloadServlet "var =" Downurl "> <c: param name =" filename " value = "$ {me.key}"> </c: param> </c: url> $ {me.value} <a href = "$ {downurl}"> download </a> <br/> </c: foreach> </body> </html>Download Processing Servlet
öffentliche Klasse DownloadServlet erweitert HttpServlet (public void dodget (httpServletRequest request, httpServletResponse -Antwort). //23239283-92489-avatar.avi Dateiname = new String (Dateiname.getBytes ("ISO8859-1"), "UTF-8"); String path = makePath (Dateiname, this.getServletContext (). GetRealPath ("/web-inf/upload")); Datei Datei = neue Datei (Pfad + "//" + Dateiname); if (! file.exists ()) {request.setAttribute ("meldung", "Die Ressource, die Sie herunterladen möchten, wurde gelöscht !!"); Request.GetRequestDispatcher ("/message.jsp"). Weiterleiten (Anfrage, Antwort); zurückkehren; } String realName = Dateiname.substring (Dateiname.indexof ("_")+1); response.setheader ("Inhaltsdisposition", "Anhang; Dateiname =" + urlencoder.encode (Realname, "UTF-8")); FileInputStream in = new FileInputStream (Pfad + "//" + Dateiname); OutputStream out = response.getOutputStream (); Byte Buffer [] = neues Byte [1024]; int len = 0; while ((len = in.read (puffer))> 0) {out.write (puffer, 0, len); } in.close (); out.close (); } public String makePath (String -Dateiname, String SavePath) {int HashCode = Dateiname.hashCode (); Int Dir1 = HashCode & 0xf; // 0--15 int dir2 = (HashCode & 0xf0) >> 4; // 0-15 String Dir = SavePath + "//" + dir1 + "//" + dir2; // Upload/2/3 Upload/3/5 Datei Datei = neue Datei (DIR); if (! file.exists ()) {file.mkdirs (); } return dir; } public void dopost (httpServletRequest Request, httpServletResponse -Antwort) löst ServletException aus, ioException {dodget (request, response); }}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.