Hay dos tipos de descargas de archivos web. Una es que el archivo está en el directorio del sitio web. Puede descargarlo ingresando directamente la ruta del archivo en el navegador, como http://www.xxx.com/file.zip. Otro tipo es que el archivo no está en el directorio del sitio web o el archivo se genera dinámicamente (exportación de informes o exportación Excel, etc.). En este caso, la descarga del archivo debe lograrse a través del OutputStream de la respuesta. DownloadUtils es una clase de herramientas de descarga de archivos web Java que proporciona una variedad de métodos estáticos para implementar la descarga de archivos.
paquete com.rhui.util; import java.io.bufferedInputStream; import java.io.bufferedOutputStream; import java.io.file; import java.io.fileInputStream; import java.io.ioException; import java.io.inputstream; import java.io.outputstream; import java.net.urlencoder; import javax.servlet.http.httpservletResponse; importar org.apache.commons.lang3.stringutils; / *** clase de descarga de archivos*/ public class downloadUtils {/ *** Descarga de archivos Codificación* Esta codificación le dice al navegador el método de codificación del nombre del archivo para evitar el código confuso al descargar nombres de archivos chinos*/ Cadena de cadena estática privada = "UTF-8"; / *** Descarga de archivo* @param Respuesta* @param filepath La ruta del archivo en el servidor, incluido el nombre del archivo*/ public static void download (httpServletResponse respuesta, cadena filePath) {archivo de archivo = nuevo archivo (filePath.ToString ()); descargar (respuesta, archivo, nulo, codificación); } /*** Descarga del archivo* @param Respuesta* @param filepath La ruta del archivo en el servidor, incluido el nombre del archivo* @param nombre de archivo el nombre del archivo descargado al navegador. Si no desea el nombre del archivo descargado por el navegador al mismo que el nombre del archivo en el servidor, establezca este parámetro */ public static void download (httpServletResponse respuesta, cadena filePath, string filename) {archivo file = nuevo archivo (filePath.ToString ()); descargar (respuesta, archivo, nombre de archivo, codificación); } /*** Descarga del archivo* @param Respuesta* @param filepath La ruta del archivo en el servidor, incluido el nombre del archivo* @param nombre de archivo el nombre del archivo descargado al navegador. Si no desea que el nombre del archivo descargue por el navegador al mismo que el nombre del archivo en el servidor, configure este parámetro* @param codificación del nombre del archivo Codificación*/ public static void download (httpservletResponse respuesta, cadena filePath, cadena de nombre de archivo, codificación de cadena) {archivo de archivo = nuevo archivo (filePath.ToString ()); descargar (respuesta, archivo, nombre de archivo, codificación); } /** * Descarga del archivo * @param Respuesta * @param Archivo del archivo * @param nombre de archivo El nombre del archivo descargado al navegador. Si no desea el nombre del archivo descargado por el navegador al mismo que el nombre del archivo en el servidor, configure este parámetro */ public static void download (httpservletreSponse respuesta, archivo de archivo) {descargar (respuesta, archivo, null, encodering); } /*** Descarga del archivo* @param Respuesta* @param Archivo del archivo* @param nombre de archivo El nombre del archivo descargado al navegador. Si no desea el nombre del archivo descargado por el navegador en el servidor, configure este parámetro */ public static void download (httpservletResponse respuesta, archivo de archivo, nombre de archivo) {descargar (respuesta, archivo, nombre de archivo, codificación); } /*** Descarga del archivo* @param Respuesta* @param Archivo del archivo* @param nombre de archivo El nombre del archivo descargado al navegador. Si no desea que el nombre del archivo descargue por el navegador al mismo que el nombre del archivo en el servidor, configure este parámetro* @param codificando el nombre del archivo codificación*/ public static void download (httpServletResponse Response, archivo, archivo FileName, String coding) {if (file == null || } // Si no especifica el nombre del archivo para descargar en el navegador, use el nombre predeterminado del archivo if (stringUtils.isblank (filename)) {filename = file.getName (); } try {inputStream is = new FileInputStream (archivo); descargar (respuesta, es, nombre de archivo, codificación); } catch (ioException e) {E.PrintStackTrace (); }} / *** Descarga de archivo* @param Respuesta* @param es la transmisión de entrada de archivo* @param nombre de archivo descargado nombre de archivo* @throws ioexception* / public static void download (httpServletResponse Respuesta, inputStream is, string fileName) {descargar (respuesta, is, nombre de archivo, codificación); } /** * File download* @param response * @param is file input stream* @param fileName Downloaded file name* @param encoding Encoding format*/ public static void download(HttpServletResponse response, InputStream is, String fileName, String encoding){ if(is == null || StringUtils.isBlank(fileName)){ return; } BufferedInputStream bis = null; OutputStream OS = NULL; BufferedOutputStream bos = null; intente {bis = new BufferedInputStream (is); OS = respuesta.getOutputStream (); bos = new BufferedOutputStream (OS); respuesta.setContentType ("Application/Octet-Stream; Charset =" + Coding); respuesta.setcharacteriCoding (codificación); Respuesta.Setheader ("Disposición de contenido", "Adjunto; FileName ="+ URLENCODER.Encode (nombre de archivo, codificación)); byte [] buffer = new Byte [1024]; int len = bis.read (buffer); while (len! = -1) {bos.write (buffer, 0, len); len = bis.read (buffer); } bos.flush (); } catch (ioException e) {E.PrintStackTrace (); } finalmente {if (bis! = null) {try {bis.close (); } catch (ioException e) {}} if (is! = null) {try {is.close (); } catch (ioException e) {}}}} public static string getEncoding () {return coding; } public static void setEncoding (codificación de cadena) {downloadUtils.Encoding = encoding; }}Si el archivo se guarda en un directorio que no es del sitio en el servidor
Cadena filepath = "c: //file.zip"; DownloadUtils.download (respuesta, filepath);
Si el archivo es un flujo de entrada
// es la transmisión de entrada de archivo // el nombre de archivo es el nombre del archivo descargado por el navegador // codificar es el nombre del archivo para evitar códigos confusos cuando hay chino en la cadena de archivo filename = "file.zip"; Codificación de cadena = "UTF-8"; DownloadUtils.download (respuesta, es, nombre de archivo, codificación);
Descargar archivos en servlet
paquete com.rhui.web.servlet; import java.io.ioException; import javax.servlet.servletException; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import com.rhui.util.downloadUtils; @WebServlet ("/descargar/servlet") public class downloadServlet extiende httpservlet {private static final long SerialVersionUid = 1l; Servicio vacío protegido (solicitud httpservletRequest, respuesta httpservletreSponse) lanza ServletException, ioException {String filePath = "c: //file.zip"; DownloadUtils.download (respuesta, filepath); }} PS: Descarga de imágenes (incluida la función de enlace antirrobo)
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); }}