Primero, permítanme presentar las tecnologías relevantes:
Dos parámetros importantes en el método de servicio.
ServLetRequest lo usa para recibir solicitudes de usuario, y su función es:
Una de sus subinterfaces: javax.servlet.http.httpservletrequest
ServLetResponse se utiliza para devolver datos al usuario.
Una de sus subinterfaces: javax.servlet.http.httpservletResponse
Tecnología de descarga de archivos:
La tecnología de descarga de archivos es relativamente simple de presentar tecnología de carga. Tomemos la descarga de fotos como ejemplo:
Navegar primero las imágenes y luego descargarlas
1. Código de front-end:
<span style = "font-size: 14px;"> <a href = "img"> Encuentre todas las imágenes en la carpeta </a> <br/> </span>
La recepción se puede hacer en una sola oración. Busque directamente programas de fondo a través de Web.xml
2. Código de visualización de fondo:
<span style = "font-size: 14px;"> clase pública showImg extiende httpservlet {public void doget (httpservletRequest solicitud, httpservletreSponse respuesta) t servletException, ioexception {<span style = "white-space: pre"> </span> dopost (solicitud, respuesta); // Para evitar excepciones, conectar Doget y dopost juntos} </span> <span style = "font-size: 14px;"> public void dopost (httpservletRequest solicitud, htt pservletreponse respuesta) arroja servletException, IOException {request.setcharacterEncoding ("UTF-8"); "> <span style =" font-size: 14px; "> // <span style =" white-space: pre "> </span> llame al servletcontext, por supuesto, también puede llamarlo directamente --- Cuando se enumera uno por uno, se requiere la ruta absoluta al archivo cuando se usa la imagen </span> ServletContext context = getServletContext (); string path = context.getRealPath ("/imgs"); // Encuentra la ruta absoluta del archivo de carpeta = nuevo archivo (ruta); "> // <span style =" white-space: pre "> </span> Después de encontrar la carpeta, enumere todas las imágenes para que los usuarios expliquen los archivos de cadena [] = file.list (); for (string fn: archivos) {</span> <preame = "código"> <span style = "font-size: 14px;"> // Muéstralos todos </span> Cadena img = "<img src = 'imgs/"+fn+"'/>";
// out.print ("<a href = imgs/'"+fn+"'> descargar imagen </a>"); string str = "<a href = 'down? name = imgs/"+fn+"'> Descargue la imagen </a> "; // Proporcione el hipervínculo para descargar, pase el parámetro --- Transfiera el nombre del archivo al contenido del enlace del usuario y escriba.print (str); out.print (img+" <br/ > ");}}
3. Descarga específica de archivos
Primero, se debe establecer el protocolo correspondiente. El protocolo de descarga requiere establecer el encabezado de descarga correspondiente
<span style = "White-Space: pre"> </span> <span style = "font-size: 18px;"> <strong> respuesta.setContentType ("Application/Force-Download" </strong>;///////// /Establezca el encabezado correspondiente </span> Al descargar, debe mostrar el nombre del archivo de la imagen actual.
<span style = "font-size: 18px;"> <span style = "white-space: pre"> </span> outputStream out = Response.getOutputStream (); // Obtener la transmisión de salida String String Name = Reque ST. getParameter ("name"); // El nombre del parámetro pasado del servicio del cliente es int num = name.lastIndexOf ("/"); "UTF- 8"); // Si el chino necesita ser recodificado // system.out.println (aa); Strong> Adjunto; Hacer una descarga específica
<span style = "font-size: 18px;"> string filename = this.getServletContext (). GetRealPath (nombre); // Obtenga la ruta absoluta, pase el nombre del archivo y al mismo tiempo, pase la ruta absoluta que se puede obtener y puede leerlo InputStream en = nuevo FileInputStream (nombre de archivo); {out.write (b, 0, len); Imagen de reproducción:
La representación después de hacer clic:
El nombre del archivo es diferente
Tecnología de carga de archivos
Será muy problemático cargar archivos usted mismo, para que podamos usar el paquete de otra persona para descargar el enlace y hacer clic para abrir el formulario de enlace:
El cliente debe usar el tipo de datos de datos multipart/formulario para representar el tipo de datos compuestos al enviar http.
Es decir: <form de enctype = "multipart/form-data">
Use el <input type = "file" name = "somename"/> html etiqueta en el formulario.
Requerido el paquete:
Commons-FileUpload.jar, la herramienta de carga de archivo central está en este paquete.
Commons-io.jar Paquete requerido para cargar archivos
Explicación detallada:
DiskFileItemFactory: cree un directorio de archivos de monitoreo de tiempo, que se refiere al tamaño del área de caché
ServletFileUpload se usa para analizar httpservletRequest. Devuelve un conjunto de objetos de archivo.
FileItem representa cada objeto de archivo cargado por el usuario.
Proceso principal:
Archivo F = nuevo archivo ("f:/ex/temp"); // Especificar la ubicación de almacenamiento de archivos temporales
DiskFileItemFactory ff = new DiskFileItemFactory (1024*1024*5, f); // La ubicación de tamaño y almacenamiento de archivos temporales
ServletFileUpload sf = new ServletFileUpload (ff);
List <StilEitem> list = sf.parserequest (request); // Comience a analizar
for (fileItem it: list) {// Obtenga el nombre del archivo. Y use UUID para resolver el problema de los nombres duplicados
FileUtils.CopyInputStreamToFile (IT.GetInputStream (), nuevo archivo (Path+"/"+FileName)); // en la carpeta especificada escrita
}
1. Código de recepción:
<span style = "font-size: 18px;"> <h2> cargar archivo </h2> <form de acción = "upfile" método = "post" <span style = "color:#ff0000;"> enctype = "multipart /formulario data "</span>> // debe escribirse, de lo contrario, la estación no puede recibir datos <!-este enctype =" multipart/form-data "---> file1 <input type =" file "< span style = "Color:#FF6666;"> Name </span> = "file"/> <br/> Ingrese un nombre: <input type = "text" <span style = "color:#ff6666;"> nombre </span> = "Desc"/> <br/> file2 <input type = "file" <span style = "color:#ff6666;"> name </span> = "file"/> <br/> Ingrese un nombre: <input type = "text" <span style = "color:#ff0000;"> name </span> = "Desc"/> <br/> <input type = "shit" value = "Envíe "/> </form> </span>
2. Código de fondo:
2-1 Primero cree una fábrica basada en disco duro para almacenar archivos temporales
// Especifique el archivo de ubicación de almacenamiento temporal f = nuevo archivo ("f:/ex/temp"); // Especifique la ubicación de almacenamiento temporal diskfileitemFactory ff = new DiskFileItemFactory (1024*1024*5, F); // Tamaño del del Ubicación temporal de archivos y almacenamiento2-2 Cree un objeto ServletFileUpload y establezca el tamaño del archivo para maximizar la transferencia del archivo
// Crear un objeto para analizar ServletFileUpload SF = new ServletFileUpload (ff); *20);
2-3 comienza a analizar el objeto
<span style = "White-Space: pre"> </span> List <StilEitem> list = sf.parserequest (request); // Obtenga toda la información transmitida desde la recepción, la recepción debe completar enctype = "multipart multiplicado /form- data "para (fileitem it: list) {it0 = it; // <span style =" White-space: pre "> </span> Si es un objeto de forma normal, puede juzgar directamente si ( it.isformfield ()) {// Es un elemento de formulario normal, como type = text name value string name = it.getString ("utf-8"); +nombre); // debajo del nombre de la explicación escrita} else {<span style = "white-space: pre"> </span> // Este es el nombre de archivo seleccionado por el nombre de la cadena de recepción = it.getName (); // La ruta de archivo específica-- -Absolute ruta // string str = it.getString (); // contenido en el archivo // system.out.println ("str"+str); .getContentType (); <preame = "código" style = "font-size: 18px;"> // <span style = "White-space: pre"> </span> El nombre del archivo de recursos en el lado del servidor no puede estar en chino, el chino, el El navegador lo codificará automáticamente --------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------ El nombre de archivo cargado se convierte en un nombre sin almacenamiento chino. El nombre de mapeo debe almacenarse y luego convertirse nuevamente cuando el usuario se descarga. // La cadena del nombre del mapa id = uuid.randomuuid (). ToString (). Reemplazar ("-", ""); // El único UUID del mundo se usa para // el nombre de archivo String LastName = name.substring (nombre. lastindexof (".")); // formato de archivo // Los formatos de archivo de nombre se encuentran todos los formatos de archivo --- Combinación de cadena FileName = id+LastName; // Nombre de archivo nuevo // Copiar transmisión. Permítelo escribir en la ubicación correspondiente fileUtils.CopyInputStreamToFile (it.getInputStream (), nuevo archivo (ruta+"/"+nombre de archivo))); // La ruta es la ruta absoluta del almacenamiento, definida anteriormente}
Esto puede lograr cargas simples, pero este tipo de carga no es segura en absoluto. El código completo se adjunta con problemas menores para evitar problemas generales.
Después de seleccionar el archivo
Verifique los archivos en el servidor web IMG, el archivo se ha cargado en la página "Nombre del archivo generado por UUID"
Código fuente de carga de archivos:
<span style = "Font-size: 14px;"> paquete cn.hncu.upfile; importar java.io.file; Java .Util.list; .apache .commons.fileUppload.fileItem; apache.commons .io.fileUtils; Sin respuesta <span style = "white-space: pre;"> </span> @Override <span style = "white-space: pre;"> </span> protegido void (httpservletRequest req, http servletResponse resp) < span style = "White-Space: pre;"> </span> lanza ServletException, ioexception {<span style = "White-Space: pre;"> </span> resp.setcontentType ("UTF-8"); span style = "White-Space: pre;"> </span> Writer WR = Resp.getWriter (); Método de carga compatible pero cargada "); <span style =" White-Space: pre; "> </span>} <span style =" White-Space: pre; "> </span> <span style =" White-Space : pre; "> </span> public void dopost (httpservletRequest solicitud, respuesta httpservletResponse) <span style =" white-space: pre; "> </span> lanza servletexception, ioexception {<span style =" white-space: pre; "> </span> request. "); <span style =" white-space: pre; "> </span> printwriter out = respuesta.getwriter (); <span style =" white-space: pre; "> </span> // proteger a Formas normales Método de carga 1: <span style = "White-space: pre;"> </span> // Valor de retorno Get (NULL) Post1 (aplicado/x-form-urlencoded, formulario normal) post2 (archivo: multipart/ FORM- DATOS, Formulario de carga de archivo) // <span style = "White-space: pre;"> </span> string type = request.getContentType (); > </span>if(_type.contains("mulitpart/form-data ")) {// <span style =" white-space: pre; "> </span> out.write (" No admitir la carga de la carga de formas normales 2 "); // <span style =" White-space: pre; "> </span> return; // <span style =" White-space: pre; "> </span>} <span style = "White-Space: Pre;"> </span> // Método 2 <span style = "White-Space: pre;"> </span> boolean boo = servletfileUpload.ismultipartContent (request); "White- Space: pre;"> </span> if (boo == false) {<span style = "white-space: pre;"> </span> out.print ("La carga 1 de las formas normales no es Soporte "); <span style =" White-Space: pre; "> </span> <span style =" White-Space: pre; "> </span>} <span style =" White-Space: pre; "> </span>} span> <span style =" white-space: pre; "> </span> // especificar ubicación de almacenamiento temporal <span style =" white-space: pre; "> </span> archivo f = nuevo archivo ("f:/ex/temp"); // Especifique la ubicación temporal de almacenamiento de archivos <span style = "white-space: pre;"> </span> diskfileitemFactory ff = new DiskFileItemFactory (1024*1024* 5, f); // Tamaño de archivo temporal y ubicación de almacenamiento <span style = "white-space: pre;"> </span> <span style = "white-space: pre;"> </span> // crea Un objeto para análisis <span style = "White-Space: pre;"> </span> ServletFileUpload SF = new ServletFileUpload (ff); (1024*1024*10); // El valor máximo de una sola ubicación de almacenamiento es 10 m <span style = "White-space: pre;"> </span> sf.setsizeMax (1024*1024*20);//// /El valor máximo de todos los archivos es 20m <span style = "White-Space: pre;"> </span> string ruta = this.getServletContext (). GetRealPath ("/imgs"); espacio: pre; "> </span> System.out.println (" Ruta de almacenamiento: "+ruta); <span style =" White-space: pre; "> </span> // comienza a analizar <span style = "White-Space: Pre "White-Space: pre;"> </span> List <StilEitem> list = sf.parserequest (request); // Obtenga toda la información transmitida desde la recepción, la recepción debe completar enctype = "multipart/form- Data "<span style =" white- space: pre; "> </span> for (fileitem it: list) {<span style =" white-space: pre; "> </span> it0 = it; <span style = "White-Space: pre;"> </span> if (it.isformfield ()) {// es un elemento de forma normal, como type = text valor de nombre <span style = "White-space: pre ; "> </span> string name = it.getString (" utf-8 "); <span style =" white-space: pre; "> </span> system.out.println (" Nombre del elemento de formulario básico: "+nombre); // escrito debajo del nombre de la explicación es <span style =" White-space: pre; "> </span>} else {<span style =" white-space: pre; "> <// span> string name = it.getName ();//ruta de archivo específica // <span style = "white-space: pre;"> </span> string n1 = it.getFieldName (); "White-Space: pre;"> </span> String str = it.getString (); // El contenido en el archivo // <span style = "White-space: pre;"> </span> sistema. out.println ("str"+str); -space: pre; "> </span> string contentType = it.getContentType (); <span style =" white-space: pre; "> </span> long size = it.getSize (); <span style = "White-Space: pre;"> </span> // Evite que el archivo esté vacío <span style = "white-space: pre;"> </span> if (size == 0) {<span style = " White-Space: pre; "> </span> continuar; // El archivo está vacío, return directamente; <span style =" White-space: pre; "> </span>} <span style =" White-Space : pre; "> </span> // nombre de usuario. Debe completar <span style = "White-Space: pre;"> </span> if (name == null || name.trim () == "") {<span style = "White-Space: pre ; "White-Space: pre;"> </span> System.out.println (Name+","+ContentType+","+size); / El nombre del archivo de recursos en el lado del servidor no puede estar en chino, el navegador lo codificará automáticamente ------------------------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------> </span> // Para permitir a los usuarios restaurar su nombre original al descargar, deben almacenar la correspondencia entre el nombre del archivo original y el nombre de mapeo, y convertirlo cuando el usuario descargue. pre; "> </span> // Nombre de mapeo <span style =" white-space: pre; "> </span> string id = uuid.randomuuid (). toString (). reemplazar ("-"," "" ); (".")); </span> string filename = id+lastName; Permítelo escribir en la ubicación correspondiente <span style = "white-space: pre;"> </span> fileUtils.CopyInputStreamToFile (IT.GetInputStream (), nuevo archivo (ruta+"/"+nombre de archivo));} <span style = "White-Space: Pre;"> </span>}} Catch (FileUploadException e) {<span style = "white-space: pre;"> </span> tirar nueva runtimeException ("error de revisión de carga de archivo". + e); span style = "White-Space: pre;"> </span> it0.delete (); // Eliminar archivo temporal <span style = "white-space: pre;"> </span>}} out.close ( );}} </span> <span style = "font-size: 18px;"> </span> código de descarga de archivo: [html] ver PlainCopyPrint? <span style = "font-size: 14px;"> paquete CN .HNCU.DOWNIMG; . Servlet.ServletException; Respuesta de respuesta) Lanza ServletExcepti on, ioException {dopost (solicitud, respuesta); Envíe el nombre de usuario a la recepción/*Transfiera la cadena de nombre de usuario fijo aa = "1.jpg"; // Si está en chino, debe codificar aa = urlencoder.encode (aa, "UTF-8"); Response.setheader ("Content-Disposition", "Adjunto; FileName = '"+aa+"'"); //// debe agregar "Adjunto;", de lo contrario se convertirá en una navegación*/outputStream out = respuesta. getOutputStream (); // Obtener el nombre de la transmisión de la salida = solicitud. subcadena (num+1); Disposición "," adjunto; filename = '"+aa+"' "); // Obtenga el nombre del archivo que se pase de allí para que pueda descargarse al almacenar String FileName = this.getServletContext (). GetRealPath (nombre); // Obtenga la ruta absoluta InputStream in = New FileInputStream (nombre de archivo); escribir (b, 0, len);}}} </span> <span style = "font-size: 18px;"> </span>Lo anterior se trata de este artículo, espero que sea útil para el aprendizaje de todos.