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.
Für das Datei -Upload leitet der Browser die Datei während des Upload -Prozesses in Form eines Streams auf den Server. Es ist problematischer, wenn Sie Servlet direkt verwenden, um den Eingabestream der hochgeladenen Datei zu erhalten und dann die Anforderungsparameter zu analysieren. Daher wird im Allgemeinen ausgewählt, um die Common-FileUpload der Datei-Upload-Komponente des Apache Open Source-Tools zu verwenden. Das JAR-Paket der Common-FileUpload-Upload-Komponente kann auf der offiziellen Website von Apache heruntergeladen werden oder finden Sie unter dem Lib-Ordner von Streben. Die Funktion des Uploads von Struts basiert auf dieser Implementierung. Common-FileUpload hängt vom Common-IO-Paket ab. Sie müssen dieses Paket auch herunterladen.
1. Konstruktion für Entwicklungsumgebung
Erstellen Sie ein FileUploadandDownLoad-Projekt und fügen Sie die zugehörigen JAR-Paket von Apache von Commons-fileUpload-Dateien-Upload-Komponenten hinzu, wie in der folgenden Abbildung gezeigt:
2. Implementieren Sie das Datei -Upload
2.1. Seite "Datei hochladen
Der Code der Seite upload.jsp ist wie folgt:
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>File Upload</title> </head> <body> <form action="${pageContext.request.contextPath}/servlet/UploadHandleServlet" enctype="multipart/form-data" method="post"> Benutzer hochladen: <Eingabe type = "text" name = "userername"> <br/> Datei hochladen 1: <Eingabe type = "Datei" name = "file1"> <br/> hochladen Datei 2: <Eingabe type = "Datei" name = "file2"> <br/> <Eingabe type = "subg. drucken?2.2. Verarbeitung von Servlets für Datei -Uploads
Der Code von UploadHandleServlet lautet wie folgt:
Paket me.gacl.web.controller; Import Java.io.file; importieren java.io.fileoutputStream; importieren java.io.ioException; importieren java.io.inputstream; importieren java.util.list; importieren javax.servlet.servletException; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; import org.apache.commons.FileUpload.FileItem; import org.apache.commons.FileUpload.disk.diskFileTemfactory; import org.apache.commons.FileUpload.servlet.servletFileUpload; öffentliche Klasse UploadHandleServlet erweitert HttpServlet {public void dagget (httpServletRequest-Anforderung, HttpServletResponse-Antwort), IOException {// Erhalten Sie das gespeicherte Verzeichnis der hochgeladenen Datei, speichern Sie die hochgeladene Datei in der Web-INF-Datei, die Sie in der Web-INF-Verzeichnis nicht zulassen. Direkten Zugriff von außen, um direkten Zugriff von außen zu ermöglichen, um direkten Zugriff von außen zu ermöglichen, um die Sicherheit direkt zu ermöglichen, können Sie direkt auf die Sicherheit von DIRECTEDD-Direktdateien. Direkter Zugriff von außen ermöglicht, um die Sicherheit von außen zu ermöglichen, um die Sicherheit von außen zu ermöglichen, um direkt zu greifen, können Sie direkt auf die Sicherheit von DIRECTEDD-Direktdateien auf dem Weg zulässt, um die Sicherheit zu erhalten, und kann direkte Zugriff auf das direkte weltweit sicherstellen. this.getServletContext (). getRealPath ("/webinf/upload"); Datei Datei = neue Datei (SAREPATH); // Beurteilen Sie, ob das gespeicherte Verzeichnis der hochgeladenen Datei vorhanden ist, wenn (! File.exists () &&! File.isdirectory ()) {System.out.println (SavePath+"Verzeichnis nicht vorhanden ist, es muss nicht erstellt werden"); // Erstellen Sie die Verzeichnisdatei.mkdir (); } // Message forders String message = ""; Versuchen Sie {// verwenden Sie die Apache -Datei -Upload -Komponente, um die Datei -Upload -Schritte zu verarbeiten: // 1. Erstellen Sie eine diskFileItemFactory Factory diskFileItemFactory factory = new diskFileItemfactory (); // 2. Erstellen Sie eine Datei hochladen parser servletFileUpload upload = new servletFileUpload (factory); // Lösen Sie die chinesischen verstümmelten Upload.SetheaDerencoding ("UTF-8"); // 3. Bestimmen Sie, ob die eingereichten Daten die Daten des Upload -Formulars sind, wenn (! ServletFileUpload.ismultipartContent (Anfrage)) {// Datenrückgabe auf traditionelle Weise abrufen; } // 4. Verwenden Sie den ServletFileUpload -Parser, um die hochgeladenen Daten zu analysieren. Das Analyseergebnis gibt eine Liste <DileItem> Sammlung zurück. Jedes FileItem entspricht dem Eingabeelement einer Formularformularliste <DileItem> list = upload.ParSequest (Anfrage); für (FileItem -Element: Liste) {// Wenn die Daten eines normalen Eingabelements im FileItem if (item.isformfield ()) {String name = item.getFieldName () eingekapselt sind; // Lösen Sie das chinesische verstümmelte Problem der Daten der gewöhnlichen Eingabeelemente String value = item.getString ("utf-8"); // value = new String (value.getBytes ("ISO8859-1"), "UTF-8"); System.out.println (Name + "=" + Wert); } else {// Wenn das Dateielement die hochgeladene Datei verknüpft // den hochgeladenen Dateinamen abrufen, String Dateiname = item.getName (); System.out.println (Dateiname); if (Dateiname == null || fileName.trim (). Equals ("")) {Fortsetzung; } // HINWEIS: Die von verschiedenen Browsern eingereichten Dateinamen sind unterschiedlich. Einige Browser senden Dateien mit Pfaden ein, wie z. B. C: /a/b/1.txt, und einige sind nur einfache Dateinamen, wie z. // Erhalten Sie den Eingabestream der hochgeladenen Datei im Element InputStream in = item.getInputStream (); // Erstellen Sie eine Dateiausgabe Stream FileOutputStream out = new FileOutputStream (SAVEPATH + "//" + Dateiname); // Erstellen Sie einen Puffer -Byte -Puffer [] = neues Byte [1024]; // Die Identifizierung, ob die Daten im Eingabestream gelesen wurden, ist int len = 0; // Der Eingabestream wird in die Pufferschleife (len = in.read (puffer))> 0 gelesen. } // den Eingabestream in.close () schließen; // den Ausgabestream ausschließen.CLOSE (); // Die temporäre Datei löschen, die beim Bearbeiten von Datei -Upeladelement generiert wird. Delete (); Message = "Datei -Upload wurde erfolgreich hochgeladen!"; }}}} catch (Ausnahme e) {message = "Datei -Upload fehlgeschlagen!"; E. printstacktrace (); } request.setAttribute ("meldung", meldung); Request.GetRequestDispatcher ("/message.jsp"). Weiterleiten (Anfrage, Antwort); } public void dopost (httpServletRequest Request, httpServletResponse -Antwort) löst ServletException aus, ioException {dodget (request, response); }}Registrieren Sie UploadhandleServlet in der Datei web.xml
<servlet> <servlet-name>UploadHandleServlet</servlet-name> <servlet-class>me.gacl.web.controller.UploadHandleServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadHandleServlet</servlet-name> <url-pattern>/servlet/UploadHandleServlet</url-pattern> </Servlet-Mapping>
Der Betriebseffekt ist wie folgt:
Nachdem die Datei erfolgreich hochgeladen wurde, wird die hochgeladene Datei im Upload-Verzeichnis im Web-INF-Verzeichnis, wie in der folgenden Abbildung gezeigt, gespeichert:
2.3. Details zum Datei -Upload
Obwohl der obige Code Dateien erfolgreich in das angegebene Verzeichnis auf dem Server hochladen kann, gibt es viele kleine Details, auf die in der Datei -Upload -Funktion geachtet werden müssen. Die folgenden Punkte sollten besondere Aufmerksamkeit auf sich nehmen.
1. Um die Sicherheit des Servers zu gewährleisten, sollten Upload-Dateien in einem Verzeichnis platziert werden, auf das von der Außenwelt, z. B. im Web-Inf-Verzeichnis, nicht direkt zugegriffen werden kann.
2. Um das Überschreiben von Dateien zu verhindern, muss ein eindeutiger Dateiname zum Hochladen der Datei generiert werden.
3. Um zu verhindern, dass zu viele Dateien unter einem Verzeichnis angezeigt werden, müssen Sie den Hash -Algorithmus verwenden, um den Speicher aufzubrechen.
4. Der Höchstwert von hochgeladenen Dateien sollte begrenzt sein.
5. Um den Typ der hochgeladenen Dateien einzuschränken, wenn Sie den Namen des hochgeladenen Dateinamens erhalten, sollten Sie feststellen, ob der Suffix -Name legal ist.
Als Reaktion auf die oben genannten 5 detaillierten Probleme verbessern wir das Upload -HandleServlet. Der verbesserte Code lautet wie folgt:
Paket me.gacl.web.controller; Import Java.io.file; importieren java.io.fileoutputStream; importieren java.io.ioException; importieren java.io.inputstream; importieren java.util.list; import Java.util.uuid; importieren javax.servlet.servletException; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; import org.apache.commons.FileUpload.FileItem; import org.apache.commons.FileUpload.FileUploadBase; import org.apache.commons.FileUpload.ProgressListener; import org.apache.commons.FileUpload.disk.diskFileTemfactory; import org.apache.commons.FileUpload.servlet.servletFileUpload; /** * @ClassName: UploadHandleServlet * @Description: TODO (I use one sentence to describe the function of this class) * @author: Guarante Canglang* @date: 2015-1-3 11:35:50 pm * */ public class UploadHandleServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServleTException, IOException {// Erhalten Sie das gespeicherte Verzeichnis der hochgeladenen Datei, speichern Sie die hochgeladene Datei im Web-inf-Verzeichnis und erlauben keinen Direktzugriff von der äußeren Welt, um die Sicherheit von hochgeladenen Dateien savePath = this.getServletContext () zu gewährleisten. // Die temporäre Datei, die während des Uploads generiert wird, wird von der Verzeichnis String temppath = this.getServletContext () gespeichert. GetRealPath ("/webinf/temp"); Datei tmpfile = new Datei (temppath); if (! } // Die Nachricht fordert String message = ""; Versuchen Sie {// verwenden Sie die Apache -Datei -Upload -Komponente, um die Datei -Upload -Schritte zu verarbeiten: // 1. Erstellen Sie eine diskFileItemFactory Factory diskFileItemFactory factory = new diskFileItemfactory (); // Setzen Sie die Größe des Puffers der Fabrik. Wenn die hochgeladene Dateigröße die Größe des Puffers überschreitet, wird eine temporäre Datei im angegebenen temporären Verzeichnis generiert und gespeichert. factory.setSizethreshold (1024*100); // Setzen Sie die Puffergröße auf 100 KB. Wenn nicht angegeben, beträgt die Puffergröße standardmäßig 10 KB. // Setzen Sie das Speicherverzeichnis der temporären Datei, die während des Hochladens fabrisch generiert wurde. // 2. Erstellen Sie eine Datei hochladen parser servletFileUpload upload = new servletFileUpload (factory); // Hör auf Datei -Upload Progress Upload.setProgressListener (new ProgressListener () {public void Update (langes PBYTesRead, Long pcontentLength, int arg2) {System.out.Out.println ("Dateigröße ist:" + pcontentLength + ", derzeit verarbeitet:" + pByTesRead). 14608, derzeit verarbeitet: 7367 Dateigröße ist: 14608, derzeit verarbeitet: 11419 Dateigröße ist: 14608, derzeit verarbeitet: 14608 */}}); // Lösen Sie die chinesischen verstümmelten Upload.SetheaDerencoding ("UTF-8"); // 3. Bestimmen Sie, ob die eingereichten Daten die Daten des Upload -Formulars sind, wenn (! ServletFileUpload.ismultipartContent (Anfrage)) {// Datenrückgabe auf traditionelle Weise abrufen; } // Setzen Sie den Maximalwert der Größe der hochgeladenen Einzeldatei, die derzeit auf 1024*1024 Bytes festgelegt ist, dh 1 MB Upload.SetFilesimemax (1024*1024); // Legen Sie den Maximalwert der Gesamtzahl der hochgeladenen Dateien fest, den Maximalwert = die Summe der maximalen Größen mehrerer Dateien, die gleichzeitig hochgeladen wurden, die derzeit auf 10 MB hochladen.Setsizemax (1024*1024*10). // 4. Verwenden Sie den ServletFileUpload -Parser, um die hochgeladenen Daten zu analysieren. Das Analyseergebnis gibt eine Liste <DileItem> Sammlung zurück. Jedes FileItem entspricht dem Eingabeelement einer Formularformularliste <FileItem> list = upload.ParSequest (Anfrage). für (FileItem -Element: Liste) {// Wenn das FileItem die Daten der gewöhnlichen Eingabemelemente verkörpert if (item.isformfield ()) {String name = item.getFieldName (); // Löst das chinesische verstümmelte Problem der Daten der gewöhnlichen Eingabeelemente String value = item.getString ("utf-8"); // value = new String (value.getBytes ("ISO8859-1"), "UTF-8"); System.out.println (Name + "=" + Wert); } else {// Wenn das FileItem die hochgeladene Datei verkauft // den Namen des hochgeladenen Datei abrufen, String Dateiname = item.getName (); System.out.println (Dateiname); if (Dateiname == null || fileName.trim (). Equals ("")) {Fortsetzung; } // HINWEIS: Die von verschiedenen Browsern eingereichten Dateinamen sind unterschiedlich. Einige Browser senden Dateinamen mit Pfaden, wie z. B. C: /a/b/1.txt, während einige nur einfache Dateinamen sind, z. B. 1.txt // Der Pfadteil des Dateinamens der erhaltenen hochgeladenen Datei verarbeiten, nur der Dateiname -Teil ist beibehalten FileName = Dateiname.substring (Dateinenname). // Erhalten Sie die Erweiterung der hochgeladenen Datei String FileExteName = Dateiname.substring (Dateiname.lastIndexof (".")+1); // Wenn Sie den hochgeladenen Dateityp einschränken müssen, können Sie die Dateierweiterung verwenden, um festzustellen, ob der hochgeladene Dateityp legal system.out.println ist ("Die Erweiterung der hochgeladenen Datei lautet:"+FileExteName); // Erhalten Sie den Eingabestream der hochgeladenen Datei im Element InputStream in = item.getInputStream (); // Erhalten Sie den Namen der Datei gespeicherte Zeichenfolge SaveFileName = MakefileName (Dateiname); // Die Datei speichern Verzeichnis String realSavePath = makePath (SaveFileName, SavePath); // Erstellen Sie eine Dateiausgabe Stream FileOutputStream out = new FileOutputStream (RealSavePath + "//" + SaveFileName); // Erstellen Sie einen Puffer -Byte -Puffer [] = neues Byte [1024]; // Die Identifizierung der Bestimmung, ob die Daten im Eingabestream gelesen wurden, ist int len = 0; // Der Eingabestream wird in den Puffer gelesen (len = in.read (puffer))> 0 bedeutet, dass in while ((len = in.read (puffer))> 0) {// FileOutputStream -Stream verwenden, um die Pufferdaten in das angegebene Verzeichnis (SavePath + // " + Filename) auszugeben. } // den Eingabestream in.close () schließen; // den Ausgabestream ausschließen.CLOSE (); // Die temporäre Datei löschen, die beim Aufbau von Dateien generiert wird //item.delete (); Message = "Datei -Upload wurde erfolgreich hochgeladen!"; }}} catch (FileUploadBase.FilesizelimitexceedException e) {e.printstacktrace (); Request.SetAttribute ("Nachricht", "Der Maximalwert einer einzelnen Datei wird überschritten !!!"); Request.GetRequestDispatcher ("/message.jsp"). Weiterleiten (Anfrage, Antwort); zurückkehren; } catch (FileUploadBase.SizElimiteXSEDEDException e) {e.printstacktrace (); Request.SetAttribute ("Nachricht", "Die Gesamtgröße der hochgeladenen Datei überschreitet den Maximalwert der Grenze !!!"); Request.GetRequestDispatcher ("/message.jsp"). Weiterleiten (Anfrage, Antwort); zurückkehren; } catch (Ausnahme e) {message = "Datei -Upload fehlgeschlagen!"; E. printstacktrace (); } request.setAttribute ("meldung", meldung); Request.GetRequestDispatcher ("/message.jsp"). Weiterleiten (Anfrage, Antwort); } /*** @Method: MakefileName* @Description: Generieren Sie den Dateinamen der hochgeladenen Datei mit dem Dateinamen als: uUid+ "_"+ Der ursprüngliche Name der Datei* @Anthor: 发官网* @param FileName Der ursprüngliche Name der Datei* @return uUid+ "_" Der ursprüngliche Name der Datei. // Um das Überschreiben von Dateien zu verhindern, muss ein eindeutiger Dateiname zum Hochladen der Datei generiert werden. Return uUid.randomuuid (). ToString () + "_" + Dateiname; } / *** Um zu verhindern, dass zu viele Dateien unter einem Verzeichnis angezeigt werden, müssen Sie den Hash -Algorithmus verwenden, um den Speicher aufzubrechen. savePath) {// Erhalten Sie den HashCode -Wert des Dateinamens, und Sie erhalten die Adresse des String -Objekt -Dateinamens im Speicher int HashCode = Dateiname.hashCode (); Int Dir1 = HashCode & 0xf; // 0--15 int dir2 = (HashCode & 0xf0) >> 4; // 0-15 // Konstruieren Sie ein neues Speicherverzeichnis String. // Upload/2/3 Upload/3/5 // Datei können sowohl die Datei als auch die Verzeichnisdatei = neue Datei (DIR) darstellen; // Wenn das Verzeichnis nicht existiert, wenn (! File.exists ()) {// die Verzeichnisdatei erstellen.mkdirs (); } return dir; } public void dopost (httpServletRequest Request, httpServletResponse -Antwort) löst ServletException aus, ioException {dodget (request, response); }}Nach der Verbesserung der oben genannten fünf kleinen Details war unsere Funktion zum Upload von Datei relativ vollständig.
3. Datei -Download
3.1. Listen Sie die zum Download bereitgestellten Dateiressourcen auf
Wir möchten den Benutzern die Dateiressourcen im Webanwendungssystem zum Download zur Verfügung stellen. Zunächst müssen wir eine Seite haben, um alle Dateien im hochgeladenen Dateiverzeichnis aufzulisten. Wenn der Benutzer auf den Datei herunterladen Hyperlink, wird er heruntergeladen und ein ListFileServlet schreiben, um alle heruntergeladenen Dateien im Webanwendungssystem aufzulisten.
Der Code von ListFileServlet lautet wie folgt:
Paket me.gacl.web.controller; Import Java.io.file; importieren java.io.ioException; import Java.util.hashMap; import Java.util.map; importieren javax.servlet.servletException; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; /** * @ClassName: ListFileServlet * @Description: List all downloaded files in the web system* @author: Guarante* @date: 2015-1-4 9:54:40 pm * */ public class ListFileServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Erhalten Sie das Verzeichnis zum Hochladen von Dateien String uploadFilePath = this.getServletContext (). GetRealPath ("/webinf/upload"); // Speichern Sie den Dateinamen, der heruntergeladen wird, Karte <String, String> filenamemap = new Hashmap <String, String> (); // Überqueren Sie rekursiv alle Dateien und Verzeichnisse im Filepath -Verzeichnis und speichern Sie den Dateinamen der Datei in der MAP -Sammlungsliste (neue Datei (UploadFilePath), Filenamemap). // Datei kann entweder eine Datei oder ein Verzeichnis darstellen // Die Kartensammlung an die Listfile.jsp -Seite für Anzeigebestellungen. request.getRequestDispatcher ("/listfile.jsp"). Forward (Request, Antwort); } /*** @Method: ListFile* @Description: rekursiv alle Dateien im angegebenen Verzeichnis* @anthor: 光克* @param -Datei bedeutet eine Datei und stellt auch eine Dateiverzeichnis dar. if (! file.isfile ()) {// Auflisten Sie alle Dateien und Verzeichnisse in der Verzeichnisdatei [] = file.listfiles (); // Dateien übertragen [] Array für (Datei f: Dateien) {// rekursive Listfile (f, map); }} else { /*** Verarbeiten Sie den Dateinamen. Die hochgeladene Datei wird in Form des Namens von UUID_FILE umbenannt. Entfernen Sie den Teil der Dateinamendatei.getName (). Indexof ("_"), um den Speicherort des Zeichens "_" in der Zeichenfolge abzurufen. Wenn der Dateiname ähnlich ist: Datei.getName (). substring (Datei.getName (). IndexOf ("_")+1); //file.getName () erhält den ursprünglichen Namen der Datei. Dieser Name ist eindeutig und kann als Schlüssel verwendet werden. Realname ist der verarbeitete Name. Es kann wiederholt werden. }} public void dopost (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, IOException {dodget (request, response); }} Hier spreche ich kurz über die Listfile -Methode in ListFileServlet. Die ListFile -Methode wird verwendet, um alle Dateien im Verzeichnis aufzulisten. Die ListFile -Methode verwendet Rekursion. In der tatsächlichen Entwicklung erstellen wir definitiv eine Tabelle in der Datenbank, in der der hochgeladene Dateinamen und das spezifische Speicherverzeichnis der Datei gespeichert werden. Wir können das spezifische Speicherverzeichnis der Datei kennen, indem wir die Tabelle abfragen, und es müssen keine Rekursionsvorgänge verwendet werden. Dieses Beispiel liegt daran, dass in der Datenbank nicht der hochgeladene Dateiname und der spezifische Speicherort der Datei gespeichert sind und der Speicherort der hochgeladenen Datei zum Aufbrechen des Speichers verwendet wird, sodass eine Übernahme erforderlich ist. Während der Rekursion wird der erhaltene Dateiname in der Kartensammlung gespeichert, die von außen an die ListFile -Methode übergeben wird, sodass wir sicherstellen können, dass alle Dateien in derselben Kartensammlung gespeichert werden.
Konfigurieren Sie ListFileServlet in der Datei web.xml
<servlet> <servlet-name>ListFileServlet</servlet-name> <servlet-class>me.gacl.web.controller.ListFileServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ListFileServlet</servlet-name> <url-pattern>/servlet/ListFileServlet</url-pattern> </servlet-mapping>
Die Seite "ListFile.jsp" mit der angezeigten Datei lautet wie folgt:
<%@ page Language = "java" import = "java.util. <!-Traverse Map Collection-> <c: foreach var = "me" items = "$ {filenamemap}"> <c: url value = "/servlet/downloadServlet" var = "Downurl"> <c: param name = "fileName" value = "$ {me.key}"> </c: param> </c: url> $ $ {VALUE {VALUE {VALUE {VALUE {VALUE $ {VALUE href = "$ {downurl}"> download </a> <br/> </c: foreach> </body> </html> Durch den Zugriff auf das ListFileServlet können Sie die Dateiressourcen anzeigen, die Benutzern auf der Seite "Listfile.jsp" zum Herunterladen zur Verfügung gestellt werden, wie in der folgenden Abbildung gezeigt:
3.2. Datei herunterladen
Schreiben Sie ein Servlet zum Herunterladen von Dateien. Der Code für den DownloadServlet lautet wie folgt:
Paket me.gacl.web.controller; Import Java.io.file; import Java.io.FileInputStream; importieren java.io.ioException; importieren java.io.outputstream; importieren java.net.urlencoder; importieren javax.servlet.servletException; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; öffentliche Klasse DownloadServlet erweitert HttpServlet {public void dodget (httpServletRequest -Anforderung, httpServletResponse -Antwort), die ServletException, IOException {// den Dateinamen zum Herunterladen von FilmeName = Request.GetParameter ("FileName"); //23239283-92489-avatar.avi Dateiname = new String (Dateiname.getBytes ("ISO8859-1"), "UTF-8"); // Die hochgeladenen Dateien werden im Unterverzeichnis von/webinf/Upload-Verzeichnis String-Dateispathungspath = this.getServletContext () gespeichert. GetRealPath ("/webinf/Upload"); // Ermitteln Sie das Verzeichnis, in dem sich die Datei über den Dateinamen String path = findFilesavePathByFileName (Dateiname, FileSaverootPath) befindet. // Die Datei zum Herunterladen von Dateis Datei = neue Datei (Pfad + "//" + Dateiname) erhalten; // Wenn die Datei nicht vorhanden ist, wenn (! File.exists ()) {Request.SetatTribute ("Nachricht", "Die Ressource, die Sie herunterladen möchten, wurde gelöscht !!"); Request.GetRequestDispatcher ("/message.jsp"). Weiterleiten (Anfrage, Antwort); zurückkehren; } // Dateiname Verarbeitungsname String realname = Dateiname.substring (Dateiname.indexof ("_")+1); // Setzen Sie den Antwortheader, um den Browser zu steuern, um die Dateiantwort zu laden. // Lesen Sie die zu heruntergeladene Datei und speichern Sie in der Dateieingabe -Stream -DateiinputStream in = new FileInputStream (Pfad + "//" + Dateiname); // Erstellen Sie den Ausgabestream OutputStream out = response.getOutputStream (); // Erstellen Sie den Buffer -Byte -Buffer [] = neues Byte [1024]; int len = 0; // Loop den Inhalt des Eingabestreams in den Puffer lesen, während ((len = in.read (puffer))> 0) {// den Inhalt des Puffers in den Browser ausgeben, um die Datei herunterzuladen.Write (Puffer, 0, Len); } // den Dateieingabestream in.close () schließen; // den Ausgabestream ausschließen.CLOSE (); } /*** @Method: findFilesavePathByFileName* @Description: Finden Sie den Pfad der Datei, die über den Dateinamen und den Speicher-Root-Verzeichnis heruntergeladen werden soll. findFilesavePathByFileName (String -Dateiname, String SaverootPath) {int HashCode = Dateiname.hashCode (); Int Dir1 = HashCode & 0xf; // 0--15 int dir2 = (HashCode & 0xf0) >> 4; // 0-15 String Dir = SaverootPath + "//" + dir1 + "//" + dir2; // Upload/2/3 Upload/3/5 Datei Datei = neue Datei (DIR); if (! file.exists ()) {// Verzeichnisdatei erstellen.mkdirs (); } return dir; } public void dopost (httpServletRequest Request, httpServletResponse -Antwort) löst ServletException aus, ioException {dodget (request, response); }}Konfigurieren von DownloadServlet in der Datei web.xml
<servlet> <servlet-name>DownLoadServlet</servlet-name> <servlet-class>me.gacl.web.controller.DownLoadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DownLoadServlet</servlet-name> <url-pattern>/servlet/DownLoadServlet</url-pattern> </servlet-mapping>
Klicken Sie auf den Hyperlink [Download], senden Sie die Anfrage an den DownloadServlet und verarbeiten Sie sie, um den Datei -Download zu erreichen. Der Betriebseffekt ist in der folgenden Abbildung dargestellt:
Aus den laufenden Ergebnissen können wir feststellen, dass unsere Datei -Download -Funktion Dateien normal herunterladen kann.
Das obige ist die detaillierteste Erläuterung des Datei -Uploads und Download -Beispiele, die vom Editor vorgestellt wurden (empfohlen). Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!