Grundlegende Ideen:
Die vorherige Idee bestand darin, eine Box aufzunehmen, um den Benutzer zu fragen, wo er die Datei speichern wollte, und dann habe ich eine andere Datei generiert und dort eingesetzt. Meine Idee war jedoch nicht erfolgreich.
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, ein <a> tag, href = "Backend-Methodeadresse". Wenn Ihre Anforderungen nicht direkt im Hyperlink verwendet werden können, können Sie es in JS schreiben
window.location.href = "Backend -Methodeadresse".
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.
Beispiel
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); }}