Ideas básicas:
La idea anterior era aparecer en una caja para preguntarle al usuario dónde quería almacenar el archivo, y luego generé otro archivo y lo puse allí. Sin embargo, mi idea no tuvo éxito.
La forma de descargar archivos es muy simple de hacer clic en el enlace. El fondo emite la transmisión del archivo y se da cuenta de la función de descarga a través del navegador, incluida la investigación sobre la ubicación y el almacenamiento de archivos. La mayoría de los navegadores configurarán una ubicación fija y no se preguntarán cada vez.
El front-end es muy simple, una etiqueta <a>, href = "dirección del método de backend". Si sus necesidades no pueden usarse directamente en Hyperlink, puede escribirlo en JS
Window.location.href = "Dirección del método de backend".
Después de saltar al método de fondo
String filepath = this.getClass (). GetClassLoader (). GetResource (""). Touri (). GetPath () + "/Exportpdf.pdf"; // ruta del archivo en el archivo del proyecto Outfile = nuevo archivo (FilePath); String filename = outFile.getName (); // Obtenga el nombre del archivo InputStream FIS = new BufferedInputStream (nuevo FileInputStream (FilePath)); byte [] buffer = new byte [fis.available ()]; fis.read (búfer); // Leer Archivo Stream Fis.Close (); respuesta.reset (); // Restablecer la respuesta del conjunto de resultados.AddHeader ("Content-Disposition", "Attachment; FileName =" + New String (FileName.ReplaceAll ("", "") .getBytes ("UTF-8"), "ISO8859-1")); // devuelve el nombre del archivo del encabezado Respuesta.AddHeader ("Content-Length", "" + outFile.length ()); // devuelve la respuesta del tamaño del archivo del encabezado.setContentType ("Application/Octet-stream"); // Establecer el tipo de datos // Obtener la salida del cuerpo de retorno Right OutStream OS = new BufferedOutputStream (Response.getOutputStream ()); OS.Write (búfer); // archivo de salida os.flush (); os.close (); El navegador reconocerá directamente esta forma de salida del archivo y aparece un cuadro de diálogo.
Tenga en cuenta que este método debe ajustarse en segundo plano utilizando el método de enlace. No es posible usar los métodos AJAX y XMLHTTPREQUEST. De esta manera, la transmisión de archivo devuelta se devolverá a la función de devolución de llamada del método. Por supuesto, si desea obtener el archivo en JS, esto funcionará.
Ejemplo
paquete cn.itcast.day06.web.servlet; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.net.urlencoder; import javax.servlet.servletContext; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletResponse; Public Class downloadServlet extiende httpservlet {public void doget (httpservletRequest solicitud, respuesta httpServletResponse) arroja servletException, ioexception {// implementa la función de la cadena anti-theft // haz que el encabezado del referente explique dónde proviene el visitante del referente de cadena = request.gheaderer ("referente"); if (referer == null ||! referer.startswith ("http: // localhost")) {// es un enlace Thief Response.sendedirect ("/day06/index.jsp"); devolver ; } // Resuelve el problema de la respuesta respuesta de respuesta confidencial china // Establezca la codificación del cuerpo del mensaje // El encabezado del mensaje de respuesta HTTP enviado a través del protocolo HTTP no puede aparecer en chino chino, los chinos deben ser cadena codificada por URL FileName = Urlencoder.encode ("beauty.jpg", "UTF-8"); // notifica al navegador que lea la respuesta del recurso. // Lea los datos de la imagen y envíelo a la cadena del navegador IE webpath = "/download/beauty.jpg"; // equivalente a la ruta de la aplicación web actual servletContext servletContext = super.getServletContext (); InputStream in = ServletContext.getResourCeasstream (WebPath); OutputStream out = Response.getOutputStream (); int len; byte [] buffer = new Byte [1024]; while ((len = in.read (buffer))! =-1) out.write (buffer, 0, len); } public void dopost (httpservletRequest solicitud, respuesta httpservletreSponse) lanza ServletException, ioexception {doget (solicitud, respuesta); }}