Requisitos: Implemente una página web con la función de descarga de archivos, principalmente descargando paquetes e imágenes comprimidos:
1: Descargar a través de Hyperlink
En una página HTML, enlace a la dirección del archivo que se descargará a través de un hipervínculo
<! Doctype html> <html> <fead> <meta charset = "utf-8"> <title> Inserte el título aquí </title> </head> <body> <h1> Descargar archivo a través de un enlace </h1> <a href = "/day06/descargar/cors.zip"> paquete de compresión </a> <a href = "/day06/download/1.png" </body> </html>
Donde Day06/Descargar es la ruta del documento, la estructura del programa de este ejemplo es la siguiente:
Después de ejecutar el programa, puede descargarlo haciendo clic en el documento que necesita descargar.
Pero aparecerá un problema aquí, es decir, cuando haga clic para descargar el paquete comprimido, aparecerá la página de descarga, pero cuando descargue la imagen, el navegador abrirá directamente la imagen y no hay descarga.
Esto se debe a que al descargar un archivo a través de un hipervínculo, si el navegador puede reconocer el formato de archivo, el navegador se abrirá directamente. La descarga solo se logrará si el navegador no puede reconocer el formato de archivo. Por lo tanto, el segundo método se usa para realizar la función de descarga.
2: Implementar la descarga a través del programa Servlet
El principio de descargar archivos a través de Servlet es leer el programa de destino a través de servlet y devolver los recursos al cliente.
<! Doctype html> <html> <fead> <meta charset = "utf-8"> <title> Inserte el título aquí </title> </head> <body> <h1> Descargar archivo a través de un enlace </h1> <a href = "/day06/descargar/cors.zip"> paquete de compresión </a> <a href = "/day06/download/1.png" <h1> Descargar archivo a través del programa Servlet </h1> <a href = "/day06/servletdownload? FileName = Cors.zip"> paquete de compresión </a> <a href = "/day06/servletdownload? FileName = 1.png"> Imagen </a> </body> </hml>
Donde /Day06 /ServletDownload es la ruta de mapeo del programa Servlet y luego crea un nuevo servlet, nombre ServletDownload, y la URL se asigna a /ServletDownload.
Agregue el código de la siguiente manera:
paquete com.lsgjzhuwei.servlet.Response; import java.io.fileInputStream; import java.io.fileOutputStream; import java.io.ioException; import java.io.inputstream; import java.io.outputstream; import javax.servlet.servletException; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; /** * Servlet Clase de implementación ServletDownload */@WebServlet (asyncsupported = true, urlpatterns = {"/servletdownload"}) clase pública ServletDownload extiende httpservlet {private static final long serialversionUid = 1l; / ** * @see httpservlet#httpservlet () */ public servletDownload () {super (); // TODO Auto Generado Constructor Stub}/** * @see httpservlet#doget (httpservletRequest request, htttpServletResponse respuesta) */protegido void doget (httpservletRequest solicitud, httpServletResponse Response) ServletException, iOException {// adoDO AUTO METOTE nombre de archivo String filename = request.getParameter ("FileName"); System.out.println (nombre de archivo); // Establezca el archivo mime type respuesta.setContentType (getServletContext (). GetMimeType (nombre de archivo)); // Establecer contenido-Disposición de respuesta.setheader ("Content-Disposition", "Adjunto; FileName ="+FileName); // Lea el archivo de destino y escriba el archivo de destino al cliente a través de la respuesta // Obtenga la ruta absoluta de la cadena del archivo de destino fulleFileName = getServletContext (). GetRealPath ("/descargar/" + nombre de archivo); //System.out.println(fullFileName); // leer el archivo inputStream in = new FileInputStream (FullFileName); OutputStream out = Response.getOutputStream (); // escribir archivo int b; while ((b = in.read ())! = -1) {out.write (b); } in.close (); out.close (); } / ** * @see httpservlet#dopost (httpservletRequest solicitud, respuesta httpServletResponse) * / proteged void dopost (httpservletRequest solicitud, respuesta httpServletResponse) tira ServletException, ioexception {// TODO Auto-Generado Método}}}}}}}}}}}}}}}}}}}}}}}}} Reinicie el servidor Tomcat para realizar la descarga de paquetes e imágenes comprimidos.
Tres. Consejos:
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, con una etiqueta <a>, href = "dirección del método de backend". Si sus necesidades no pueden usarse directamente en el modo de hipervínculo, puede escribir Window.location.href = "Dirección de método de backend" en JS.
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á.