Es gibt zwei Arten von Webdatei -Downloads. Eine davon ist, dass sich die Datei im Website -Verzeichnis befindet. Sie können es herunterladen, indem Sie den Dateipfad direkt in den Browser eingeben, z. B. http://www.xxx.com/file.zip. Ein anderer Typ ist, dass sich die Datei nicht im Website -Verzeichnis befindet oder die Datei dynamisch generiert wird (exportieren oder Exporte Excel usw. exportieren). In diesem Fall muss der Datei -Download über den Ausgabestream der Antwort erreicht werden. DownloadUtils ist eine Java -Webdownload -Toolklasse, die eine Vielzahl statischer Methoden zum Implementieren von Datei -Download bietet.
Paket com.rhui.util; import Java.io.BufferedInputStream; importieren java.io.bufferedOutputStream; Import Java.io.file; import Java.io.FileInputStream; importieren java.io.ioException; importieren java.io.inputstream; importieren java.io.outputstream; importieren java.net.urlencoder; importieren javax.servlet.http.httpServletResponse; import org.apache.commons.lang3.stringutils; / *** Datei-Download-Klasse*/ öffentliche Klasse DownloadUTILS {/ *** Datei-Download-Encodierung* Diese Enkodierung gibt dem Browser die Codierungsmethode des Dateinamens an, um verstümmelte Code beim Herunterladen chinesischer Dateinamen*/ private static String coding = "utf-8" zu verhindern. / *** Datei herunterladen* @param antwort* @param filepath Der Pfad der Datei auf dem Server, einschließlich des Dateinamens*/ public static void download (httpServletResponse -Antwort, String filepath) {Dateidatei = neue Datei (filepath.toString ()); Download (Antwort, Datei, Null, Codierung); } /*** Datei -Download* @param Antwort* @param filepath Der Pfad der Datei auf dem Server, einschließlich des Dateinamens* @param Dateiname Der Name der Datei, die in den Browser heruntergeladen wurde. Wenn Sie nicht möchten, dass der Name der Datei vom Browser auf den Dateinamen auf dem Server heruntergeladen wird, setzen Sie diesen Parameter */ public static void download (httpServletResponse -Antwort, String -Filepath, String FileName) {Datei Datei = neue Datei (filepath.toString ()); Download (Antwort, Datei, Dateiname, Codierung); } /*** Datei -Download* @param Antwort* @param filepath Der Pfad der Datei auf dem Server, einschließlich des Dateinamens* @param Dateiname Der Name der Datei, die in den Browser heruntergeladen wurde. Wenn Sie nicht möchten, dass der Dateinamen vom Browser auf den Dateinamen auf dem Server heruntergeladen wird, setzen Sie diesen Parameter* @param Encodierungsdateinamen Codierung*/ public static void download (httpServletResponse -Antwort, String -Filepath, String FileName, String -Codierung) {neue Datei = neue Datei (Filepath.ToString (); Download (Antwort, Datei, Dateiname, Codierung); } /** * Datei -Download * @param Antwort * @param Datei Datei * @param Dateiname Der Name der heruntergeladenen Datei an den Browser. Wenn Sie nicht möchten, dass der Dateinamen vom Browser auf den Dateinamen auf dem Server heruntergeladen wird, setzen Sie diesen Parameter */ public static void download (httpServletResponse -Antwort, Dateidatei) {Download (Antwort, Datei, Null, Codierung); } /*** Datei -Download* @param Antwort* @param Datei Datei* @param Dateiname Der Name der heruntergeladenen Datei an den Browser. Wenn Sie nicht möchten, dass der Dateinamen vom Browser auf dem Dateinamen auf dem Server vom Browser heruntergeladen wird, setzen Sie diesen Parameter */ public static void download (httpServletResponse -Antwort, Dateidatei, String -Dateiname) {Download (Antwort, Datei, FileName, Enckodierung); } /*** Datei -Download* @param Antwort* @param Datei Datei* @param Dateiname Der Name der heruntergeladenen Datei an den Browser. Wenn Sie nicht möchten, dass der Dateiname vom Browser auf den Dateinamen auf dem Server heruntergeladen wird, setzen Sie diesen Parameter* @param codierende Dateiname Codierung*/ public static void download (httpServletResponse -Antwort, Datei -Datei, String FileName, String -Encoding) {if (Datei == null ||! } // Wenn Sie den Namen der Datei nicht an den Download in den Browser angeben, verwenden Sie den Standardnamen der Datei if (stringutils.isblank (Dateiname)) {FileName = Datei.getName (); } try {inputStream ist = new FileInputStream (Datei); Download (Antwort, IS, Dateiname, Codierung); } catch (ioException e) {e.printstacktrace (); }} / *** Datei -Download* @param Antwort* @param ist Dateieingabestream* @param Dateiname heruntergeladener Dateiname* @throws ioException* / public static void download (httpServletResponse -Antwort, InputStream IS, Stritch FileName) {Download (Antwort, IS, Dateiname, Codierung); } / *** Datei -Download* @param antwort* @param ist Dateieingabestream* @param Dateiname heruntergeladener Dateiname* @param codierende Codierungsformat* / public static void download (httpServletResponse -Antwort, InputStream IS, String Dateiname, String -Codierung) {is == NULL | } BuferedInputStream Bis = null; OutputStream os = null; BufferedOutputStream bos = null; Versuchen Sie {Bis = new buferedInputStream (IS); os = response.getOutputStream (); BOS = neuer BufferedOutputStream (OS); response.setContentType ("Anwendung/Oktett-Stream; charSet =" + codierung); response.setcharactercoding (codieren); response.setheader ("Inhaltsdisposition", "Anhang; Dateiname ="+ urlencoder.encode (Dateiname, codieren)); byte [] buffer = neues byte [1024]; int len = Bis.read (Puffer); while (len! = -1) {bos.write (puffer, 0, len); Len = Bis.read (Puffer); } bos.flush (); } catch (ioException e) {e.printstacktrace (); } endlich {if (bis! = null) {try {Bis.close (); } catch (ioException e) {}} if (is! = null) {try {is.close (); } catch (ioException e) {}}}} public static String getCoding () {return codierung; } public static void setEneCoding (String coding) {downloadUtils.encoding = codieren; }}Wenn die Datei in einem Verzeichnis ohne Standort auf dem Server gespeichert wird
String filepath = "c: //file.zip"; DownloadUtils.download (Antwort, Filepath);
Wenn die Datei ein Eingabestream ist
// ist der Dateieingabestream // Dateiname ist der vom Browser heruntergeladene Dateiname // Codierung ist der Dateiname, um verstümmelte Codes zu verhindern, wenn in der Datei String Dateiname = "file.zip" Chinese vorhanden ist. String coding = "utf-8"; DownloadUtils.download (Antwort, IS, Dateiname, Codierung);
Laden Sie Dateien in Servlet herunter
Paket com.rhui.web.servlet; importieren java.io.ioException; importieren javax.servlet.servletException; import javax.servlet.annotation.webservlet; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; import com.rhui.util.downloadUtils; @WebServlet ("/download/servlet") öffentliche Klasse DownloadServlet erweitert httpServlet {private statische endgültige long serialversionuid = 1l; Protected void Service (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, IOException {String filepath = "c: //file.zip"; DownloadUtils.download (Antwort, Filepath); }} PS: Bilddownload (einschließlich Anti-Diebstahl-Linkfunktion)
Paket cn.itcast.day06.Web.Servlet; importieren java.io.ioxception; import java.io.inputstream; import java.io.outputstream; import Java.net.urlencoder; importieren javax.servlet.servletContext; import javax.servlet.servletException; import javax.servlet.http.httpServlet; import javax.servlet.http.httpletrequest; import javax.servlet.http.htpletpletresponse; öffentliche Klasse DownloadServlet erweitert HttpServlet (public void dodget (httpServletRequest Request, httpServletResponse-Antwort). if (referer == null ||! referer.startswith ("http: // localhost")) {// Es ist eine Link -Thief -Antwort.sendredirect ("/day06/index.jsp"); zurückkehren ; } // Das Problem der Antwort von Response lösen chinesische Antwort Antwort. // Setzen Sie die Codierung des Meldungsgremiums // Der über das HTTP-Protokoll gesendete HTTP-Antwort-Nachrichten-Meldungsheader kann auf Chinesisch nicht erscheinen. Chinesisch müssen url-codierte String-Dateiname = urlencoder.encode ("Beauty.jpg", "Utf-8"); // den Browser benachrichtigen, um die Ressourcenantwort zu lesen. // Lesen Sie die Bilddaten und senden Sie sie an den IE -Browser -String webpath = "/download/beauty.jpg"; // äquivalent dem Pfad der aktuellen Webanwendung ServletContext ServletContext = Super.getServletContext (); InputStream in = ServletContext.getResourceAsStream (WebPath); OutputStream out = response.getOutputStream (); Int len; byte [] buffer = neues byte [1024]; while ((len = in.read (puffer))! =-1) out.write (puffer, 0, len); } public void dopost (httpServletRequest Request, httpServletResponse -Antwort) löst ServletException aus, ioException {dodget (request, response); }}