1. La forma más directa y sencilla es colocar la dirección del archivo directamente en un enlace en la página html. La desventaja de esto es que la ruta del archivo en el servidor queda expuesta y no se pueden realizar otros controles (como permisos) en la descarga de archivos. No escribiré un ejemplo aquí.
2. En el lado del servidor, el archivo se convierte en un flujo de salida, se escribe en la respuesta y el archivo se lleva al navegador con la respuesta. El navegador pregunta al usuario si está dispuesto a guardar el archivo localmente. (ejemplo a continuación)
<%
respuesta.setContentType(fileminitype);
respuesta.setHeader("Ubicación",nombre de archivo);
respuesta.setHeader("Cache-Control", "max-age=" + cacheTime);
respuesta.setHeader("Content-Disposition", "attachment; filename=" + filename); //el nombre del archivo debe estar codificado (utf-8)
respuesta.setContentLength(longitud del archivo);
OutputStream OutputStream = respuesta.getOutputStream();
InputStream inputStream = nuevo FileInputStream (ruta de archivo);
byte[] buffer = nuevo byte[1024];
int yo = -1;
mientras ((i = inputStream.read(buffer)) != -1) {
salidaStream.write(búfer, 0, i);
}
salidaStream.flush();
salidaStream.close();
inputStream.close();
flujo de salida = nulo
%>
3. Como es JSP, otra forma es utilizar Applet para descargar archivos. Sin embargo, el cliente primero debe confiar en su subprograma Applet, que aceptará el flujo de datos enviado por el servlet y lo escribirá localmente.
ejemplo del lado del servlet
servicio público nulo (solicitud HttpServletRequest, resolución HttpServletResponse)
lanza ServletException, IOException {
res.setContentType("texto/sin formato");
Flujo de salida flujo de salida = nulo;
intentar {
flujo de salida = res.getOutputStream();
popFile(srcFile, outputStream));//Escribe el archivo con la ruta del archivo srcFile en OutputStream.
} captura (IOException e) {
e.printStackTrace();
}
}
Ejemplo paralelo de JApplet
Estafa de URLConnection;
intentar {
con = url.openConnection();//url es la URL del SERVLET llamado, como http://localhost:8080/sendDateSevlet.do
con.setUseCaches(falso);
con.setDoInput(verdadero);
con.setDoOutput(verdadero);
con.setRequestProperty("Tipo de contenido",
"aplicación/flujo de octetos");
InputStream en = con.getInputStream();
ProgressMonitorInputStream pmInputStream = nuevo ProgressMonitorInputStream(
panel, "Descargar el contenido del archivo desde el servidor", en);
Monitor de progreso pMonitor = pmInputStream
.getProgressMonitor();
pMonitor.setMillisToDecideToPopup(3);
pMonitor.setMillisToPopup(3);
String localfilepath = localstr + filename;//localfilepath ruta local, carpeta de archivos localstr, nombre de archivo nombre de archivo local
if(saveFilsaveFilee(localfilepath,pmInputStream)){ //El método saveFilsaveFilee escribe el flujo de entrada pmInputStream en el archivo localfilepath.
openLocalFile(rutadelarchivolocal);
}
4. Por cierto, también está publicado el código para que JApplet cargue archivos.
Ejemplo paralelo de JApplet
URLConnection con;
intentar {
con = url.openConnection();//url es la URL del SERVLET llamado, como http://localhost:8080/sendDateSevlet.do
con.setUseCaches(falso);
con.setDoInput(verdadero);
con.setDoOutput(verdadero);
con.setRequestProperty("Tipo de contenido",
"aplicación/flujo de octetos");
OutputStream fuera = con.getOutputStream();
String localfilepath = localstr + filename; //localfilepath ruta local, carpeta de archivos localstr, nombre de archivo nombre de archivo local
getOutputStream(localfilepath,out);//El archivo getOutputStream escribe la ruta del archivo local en el flujo de salida.
InputStream en = con.getInputStream();
devolver verdadero;
}captura (IOException e) {
System.out.println("¡Error al cargar el archivo!");
e.printStackTrace();
}
ejemplo de código lateral de servlet
servicio público nulo (solicitud HttpServletRequest, resolución HttpServletResponse)
lanza ServletException, IOException {
res.setContentType("texto/sin formato");
Flujo de entrada flujo de entrada = nulo;
intentar {
flujo de entrada = res.getInputStream();
writefile(srcFile, inputStream);//Guarde el flujo de entrada inputStream en el archivo con la ruta del archivo srcFile
} captura (IOException e) {
e.printStackTrace();
}
} // finalizar
el resumen del servicio: en la transmisión de archivos, existe en forma de secuencia y en el disco duro, existe en forma de archivo. Todo lo que tenemos que hacer es enviar la transmisión y leerla a través de HttpServletRequest y HttpServletResponse, o responder y solicitar. Así como operaciones que convierten archivos en transmisiones o transmisiones en archivos.