Anforderungen: Implementieren Sie eine Webseite mit Datei -Download -Funktion, wobei hauptsächlich komprimierte Pakete und Bilder heruntergeladen werden:
1: Download über Hyperlink
In einer HTML -Seite Link zur Adresse der Datei, die über einen Hyperlink heruntergeladen werden soll
<! DocType html> <html> <head> <meta charset = "utf-8"> <title> Title hier einfügen </title> </head> <body> <h1> Download-Datei durch Link durch Link </h1> <a href = "/tag06/download/cors.zip"> compresionion paket </a> </a> <a.href = "/download/download/download/download/download/download/a. </body> </html>
Wenn Day06/Download der Dokumentpfad ist, lautet die Programmstruktur dieses Beispiels wie folgt:
Nachdem das Programm ausgeführt wurde, können Sie es herunterladen, indem Sie auf das Dokument klicken, das Sie herunterladen müssen.
Ein Problem wird jedoch hier angezeigt, dh wenn Sie klicken, um das komprimierte Paket herunterzuladen, wird die Download -Seite angezeigt. Wenn Sie das Bild herunterladen, öffnet der Browser das Bild direkt und es gibt keinen Download.
Dies liegt daran, dass beim Herunterladen einer Datei über einen Hyperlink, wenn der Browser das Dateiformat erkennen kann, der Browser direkt geöffnet wird. Das Herunterladen wird nur erreicht, wenn der Browser das Dateiformat nicht erkennen kann. Daher wird die zweite Methode verwendet, um die Download -Funktion zu realisieren.
2: Implementieren Sie den Download über das Servlet -Programm implementieren
Das Prinzip des Herunterladens von Dateien über Servlet besteht darin, das Zielprogramm über Servlet zu lesen und die Ressourcen an den Client zurückzugeben.
<! DocType html> <html> <head> <meta charset = "utf-8"> <title> Title hier einfügen </title> </head> <body> <h1> Download-Datei durch Link durch Link </h1> <a href = "/tag06/download/cors.zip"> compresionion paket </a> </a> <a.href = "/download/download/download/download/download/download/a. <h1> Datei über das Servlet -Programm herunterladen </h1> <a href = "/day06/servletDownload? Dateiname = cors.zip"> Komprimierungspaket </a> <a href = "/day06/servletDownLoad? Dateiname = 1.png"> Bild </a> </body> </html>>
Wo /Day06 /ServletDownload der Zuordnungspfad des Servlet -Programms und dann ein neues Servlet erstellen, nennen Sie Servletdownload, und die URL wird an /servletdownload zugeordnet.
Fügen Sie den Code wie folgt hinzu:
Paket com.lsgjzhuwei.servlet.Response; import Java.io.FileInputStream; importieren java.io.fileoutputStream; importieren java.io.ioException; importieren java.io.inputstream; importieren java.io.outputstream; importieren javax.servlet.servletException; import javax.servlet.annotation.webservlet; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; /** * Servlet -Implementierungsklasse ServletDownload */@webservlet (asyncSupported = true, urlpatterns = {"/servletDownload"}) public class ServletDownLoad erweitert HttpServlet {private statische statische endgültige long serialversionuid = 1l; / ** * @see httpServlet#httpServlet () */ public servletDownload () {super (); // todo automatisch generierter Konstruktor Stub}/** * @see httpServlet#dagget (httpServletRequest Request, HttpServletResponse-Antwort) */Protected void dodget (httpServletrequest Request, HTTPServletRespect-Response) -Antret-Antragsanforderung, IOOException | Dateiname String mateiname = request.getParameter ("Dateiname"); System.out.println (Dateiname); // Setzen Sie die Dateimime -Typ -Antwort. // Inhalts-Disposition-Antwort festlegen. // Lesen Sie die Zieldatei und schreiben Sie die Zieldatei über Antwort an den Client // Erhalten Sie den absoluten Pfad der Zieldatei Zeichenfolge FullFileName = getServletContext (). GetRealPath ("/download/" + Dateiname); //System.out.println(fullFileName); // Datei inputStream lesen in = new FileInputStream (fullFileName); OutputStream out = response.getOutputStream (); // Datei schreiben int b; while ((b = in.read ())! = -1) {out.write (b); } in.close (); out.close (); } / ** * @see httpServlet#dopost (httpServletRequest-Anforderung, httpServletResponse-Antwort) * / Protected void dopost (httpServletRequest-Anforderung, HttpServletRespespect-Antwort) Die ServetException, IOException {// // toDo-auto-gentreated-Methode Stub}}}}} Starten Sie den Tomcat -Server neu, um den Download von komprimierten Paketen und Bildern zu realisieren.
Drei. Tipps:
Die Möglichkeit zum Herunterladen von Dateien ist sehr einfach auf den Link zu klicken. Der Hintergrund gibt den Dateistrom aus und realisiert die Download -Funktion über den Browser, einschließlich der Anfragen zu Ort und Dateispeicher. Die meisten Browser konfigurieren einen festen Speicherort und werden möglicherweise nicht jedes Mal gefragt.
Das Front-End ist sehr einfach, mit einem <a> tag, href = "Backend-Methodeadresse". Wenn Ihre Anforderungen nicht direkt im Hyperlink -Modus verwendet werden können, können Sie in JS Fenster schreiben.
Nach dem Springen zur Hintergrundmethode
String filepath = this.getClass (). GetClassloader (). GetResource (""). Touri (). GetPath () + "/Exportpdf.pdf"; // Pfad der Datei in der Projektdatei outfile = new Datei (Filepath); String -Dateiname = outfile.getName (); // den Dateinamen inputStream fis = new bufferedInputStream (neuer FileInputStream (Filepath)) abrufen; byte [] buffer = new byte [fis.Available ()]; fis.read (puffer); // Dateistream lesen fis.close (); response.reset (); // Setzen Sie das Ergebnis set response.addHeader ("Content-Disposition", "Attachment; Dateiname =" + neue String (Dateiname // Die Header-Dateiname Antwort zurücksend. // Rückgabe der Header-Dateigröße Antwort. // Legen Sie den Datentyp ein // RETURN CODS OUTTION Right OutputStream OS = new BufferedOutputStream (response.getOutputStream ()); OS.Write (Puffer); // Ausgabedatei os.flush (); os.close (); Der Browser erkennt diese Form der Dateiausgabe direkt und ein Dialogfeld wird angezeigt.
Beachten Sie, dass diese Methode mithilfe der Link -Methode im Hintergrund angepasst werden muss. Es ist nicht möglich, AJAX- und XMLHTTPREQUEST -Methoden zu verwenden. Auf diese Weise wird der zurückgegebene Dateistrom in die Rückruffunktion der Methode zurückgegeben. Wenn Sie die Datei in JS erhalten möchten, funktioniert dies natürlich.