Veamos primero el ejemplo más simple de descarga de archivos:
Copie el código de código de la siguiente manera:
paquete com.yyz.response;
importar java.io.FileInputStream;
importar java.io.IOException;
importar java.io.OutputStream;
importar javax.servlet.ServletException;
importar javax.servlet.http.HttpServlet;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
//descarga de archivos
clase pública ResponseDemo extiende HttpServlet {
public void doGet (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
Cadena realpath = this.getServletContext().getRealPath("/download/1.gif");
Nombre de archivo de cadena = realpath.substring(realpath.lastIndexOf("//")+1);
respuesta.setHeader("disposición-contenido", "attachment;filename="+nombre de archivo);
//El servidor usa este encabezado para indicarle al navegador que abra los datos en modo de descarga
FileInputStream en = nuevo FileInputStream(ruta real);
int longitud = 0;
buffer de bytes[]=nuevo byte[1024];
OutputStream fuera = respuesta.getOutputStream();
while((len = in.read(búfer))>0){
out.write(búfer, 0, len);
}
cercar();
// No es necesario cerrar. Cuando se destruye la respuesta, el servidor cerrará automáticamente la secuencia relacionada con la respuesta.
}
public void doPost (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
doGet(solicitud,respuesta);
}
}
La función de este código es descargar la imagen 1.png del servidor. La estructura del directorio se muestra de la siguiente manera usando el explorador de paquetes de MyEclipse:
Hagámoslo un poco más difícil. El archivo que queremos descargar es un archivo con nombre chino. Dado que las cosas en el archivo de encabezado en el protocolo http solo pueden ser caracteres ASCII, el método anterior (cambie directamente String realpath = this.getServletContext().getRealPath("/download/1.gif"); a String realpath = this. getServletContext().getRealPath("/download/picture.gif");) Obtenga el archivo directamente,
Habrá problemas de código confuso. Adjunto los resultados de las pruebas:
Para resolver este problema, utilice el método de codificación de la clase URLEncoder:
Copie el código de código de la siguiente manera:
paquete com.yyz.response;
importar java.io.FileInputStream;
importar java.io.IOException;
importar java.io.OutputStream;
importar java.net.URLEncoder;
importar javax.servlet.ServletException;
importar javax.servlet.http.HttpServlet;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
//Al descargar archivos chinos, los nombres de los archivos chinos deben estar codificados en URL.
clase pública ResponseDemo extiende HttpServlet {
public void doGet (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
Cadena realpath = this.getServletContext().getRealPath("/download/picture.gif");
Nombre de archivo de cadena = realpath.substring(realpath.lastIndexOf("//")+1);
respuesta.setHeader("disposición de contenido", "attachment;filename="+URLEncoder.encode(nombre de archivo,"UTF-8"));
//Esta función codifica la cadena en URL
FileInputStream en = nuevo FileInputStream(ruta real);
int longitud = 0;
buffer de bytes[]=nuevo byte[1024];
OutputStream fuera = respuesta.getOutputStream();
while((len = in.read(búfer))>0){
out.write(búfer, 0, len);
}
cercar();
}
public void doPost (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
doGet(solicitud,respuesta);
}
}
Adjunto los resultados de las pruebas:
Además, hay un pequeño detalle al que todo el mundo debe prestar atención:
FileReader no se puede utilizar en lugar de FileInputStream. Los datos se perderán al usar FileReader. La razón es la siguiente: FileReader es un flujo de caracteres y datos como imágenes y archivos multimedia se almacenan en forma de 01. Al leer con FileReader, debe consultar una tabla de codificación. no se especifica la codificación. Se utiliza la codificación predeterminada para la plataforma correspondiente. Por ejemplo, las computadoras en China verificarán GB2312. Cuando se lee un código que no existe en la tabla de códigos GB2312, los datos se codificarán en '? ', los datos pasarán a ser chinos y '? 'Mezcla. Después de enviarlo al cliente, verifique la tabla de códigos nuevamente cuando la muestre y reemplace todos los códigos '?' con '?' Solo recuerde una cosa sobre este detalle: los flujos de bytes pueden manejar cualquier tipo de datos, los flujos de caracteres solo pueden manejar datos de caracteres.