Los ejemplos en este artículo comparten con usted la tecnología de carga de archivos Java para su referencia. El contenido específico es el siguiente
Forma:
El cliente debe usar el tipo de datos de datos multipart/formulario para representar el tipo de datos compuestos al enviar http. Ahora mismo:
Use etiquetas HTML en el formulario.
Requerido el paquete:
Commons-FileUpload.jar, la herramienta de archivo de carga central está en este paquete.
Commons-io.jar Paquete requerido para cargar archivos
Explicación detallada de la clase de archivo de carga:
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.
<%@ page lenguaje = "java" import = "java.util.*" pageEncoding = "utf-8"%> <! DocType html público "-// w3c // dtd html 4.01 transitional // en"> <html> <foad> <title> COMPLEZA DE ARCE DE ARCE </title> </head> <font color Board-Entiende la capa subyacente </font> <!-multipart/form-data: multipart (no solo archivos, sino también piezas)-> <form de acción = "<%= request.getContextPath ()%>/upload0" método = "post" enctype = "multipart/data"> archivo: <input type = "file =" archivo "/> <> <input type =" Subting "Subt" valor " El nombre de archivo cargado no puede estar en chino, de lo contrario, el nombre de archivo obtenido está confuso, pero el siguiente ejemplo puede resolver este problema-> </form> <br/> <font color = "rojo" size = "6"> Use el archivo apache de carga para lograr la carga de archivo </font> <!-Application/X-wwwwwwwwncodeDed-> <form action = "<%= solicitud.getConteNtonteNtettpath ()) método = "post" enctype = "multipart/form-data"> archivo: <input type = "file" name = "file"/> <input type = "enviar" value = "cargar"/> </form> <font color = "rojo" size = "6"> Use la herramienta de carga de archivo Apache para lograr la carga de archivo 2 (resolver el nombre de archivo aficionado) </font> <p> Post1 (Forma normal): enctype = application/x-www-form-urlencoded (valor predeterminado) </p> <p> post2 (formulario de archivo de carga): enctype = multipart/formy-data: multipart (no solo solo archivos, sino también piezas) </p> <formy = "<%= request.getContextPath ()%>/upoad2" Method = "Post" Inctype = "Multipart/" Multipart/" type = "file" name = "file"/> <!-Post2 (formulario de archivo de carga)-> <br/> Descripción del archivo: <input type = "text" name = "desc"/> <!-post1 (formulario normal)-> <br/> file 2: <input type = "file" name = "file"/> <br/> descripción de archivo 2: <input type = "name" = "desc"/> <<!-<!-<!-Post1 (file "(archivo"/> <BR/> Descripción 2: <input type = "text" name = "DESC"/> <<!-<!-<!-Post1 (file " 2: <input type = "file" name = "file"/> <br/> del archivo descripción 2: <input type = "text" name = "Desc"/> <input type = "subt" value = "upload"/> </orm> <font color = "rojo" size = "6"> Use la herramienta de carga de archivo Apache para lograr el archivo de archivo 3 (rompido de archivo) </font> <!- Post1 (normal 1 (normal "(Normal normal" Formulario): enctype = application/x-www-form-urlencoded (valor predeterminado)-> <!-post2 (formulario de archivo de carga): enctype = multipart/formy-data: multipart (no solo solo archivos, sino también partes)-> <Form Action = "<%= request.getContextPath ()%>/upload3" Method = "Post" Inctype = "Multipart/" Multipart/"Form-data" name = "file"/> <!-post2 (formulario de archivo de carga)-> <br/> Descripción del archivo: <input type = "text" name = "descr"/> <!-post1 (formulario normal)-> <br/> <br/> file 2: <input type = "file" name = "archivo"/> <br/> descripción de archivo 2: <input type = "text" name = "desc"/> <type type "sometle" </form> </body> </html>
Comprender la capa inferior del tablero de transición
paquete cn.hncu.servlet; import java.io.bufferedReader; import java.io.ioxception; import java.io.inputstream; import java.io.inputstreamreader; import java.io.printwriter; import javax.servlet.servletException; import javax.servlet.http.htttttttttttttpser javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; public class upload0Servlet extiende httpservlet {public void dopost (httpservletRequest solicitud, httpServletResponse Respuesta) lanza Servletexception, iOexception {inyingServequest Solicitud in = request.getInputStream (); BufferedReader BR = New BufferedReader (new InputStreamReader (in)); Línea de cadena; while ((línea = br.readline ())! = null) {system.out.println (línea); }}}Use la herramienta de carga de archivos Apache para implementar la carga de archivos
paquete cn.hncu.servlet; import java.io.file; import java.io.ioexception; import java.io.printwriter; import java.util.list; import java.util.uuid; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import; importar; importar; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; importar org.apache.commons.fileUpload.fileitem; import org.apache.commons.fileupload.fileuploadexception; import org.apache.commons.fileupload.disk.diskfileitemFactory; import org.apache.commons.fileUpload.servlet.servletFileUpload; import org.apache.commons.io.fileutils; public class SobreadServlet extiende httpservlet {public void doget (hetget (hetget (hettpserTpsEntps. HttpServletResponse Respuesta) lanza ServletException, ioException {Response.SetContentType ("Text/Html"); PrintWriter out = Response.getWriter (); out.println ("<! DocType html public/"-// w3c // dtd html 4.01 transitional // en/">"); out.println ("<html>"); out.println ("<Ethead> <title> un servlet </title> </head>"); out.println ("<body>"); out.print ("no es compatible con la carga ... out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); } public void dopost (httpservletRequest solicitud, httpservletResponse respuesta) arroja servletException, ioexception {// en el servidor, especifique un directorio para todos los archivos cargados string rath = getServletContext (). getRealPath ("/cargue"); System.out.println ("ruta:"+ruta); Archivo dir = nuevo archivo (ruta); if (! dir.exists ()) {dir.mkdirs (); } // Crear una fábrica de fábrica basada en disco duro // diskfileitemFactory disk = new DiskFileItemFactory (); // Establecer directorio temporal (se recomienda diseñar un directorio temporal, de lo contrario, se utilizará el directorio temporal del sistema.) //Disk.setRepository(new file ("d:/a")); // 3. Establezca el tamaño del búfer para escribir datos en el disco de disco duro. // Cuando el archivo es más grande que esta configuración, se formará un archivo temporal en el directorio temporal // Establecer el tamaño del búfer de archivo temporal-8k búfer, dirección de archivo temporal diskfileitemFactory f = new DiskFileItemFactory (1024*8, nuevo archivo ("d:/a")); // Herramienta de carga: cree un objeto para analizar servletFileUpload upload = new ServletFileUpload (f); upload.setFileSizeMax (1024*1024*5); // Establezca el archivo único cargado máximo en 5m // Establezca el tamaño máximo del archivo cargado. Si se trata de múltiples archivos, es la suma de múltiples archivos de hasta 8m upload.setsizeMax (1024*1024*8); // Establezca la suma de todos los tamaños de archivo cargados hasta 8m // Use la herramienta de análisis para analizar {list <StilEitem> list = upload.parserequest (solicitud); para (fileItem fi: list) {System.out.println ("Tipo de contenido de archivo:"+fi.getContentType ()); // Tipo de contenido de archivo: Text/Plain System.out.Println ("Nombre de archivo:"+fi.getName ()); // Nombre del archivo: c: /users/adl1/Desktop/a.txt string ext = fi.getName (). Substring (fi.getName (). LastIndexOf (".")); //. Txt String UUID = UUID.RANDOMUUID (). ToString (). Reemplazar ("-", ""); Cadena filename = uuid+ext; // fileUtils.CopyInputStreamToFile (fi.getInputStream (), nuevo archivo ("d: /a/d/a.txt")); // escríbelo // fi.getInputStream () es la información real de archivos fileutils.copyInputStreamToFile (Fi.getStream (), neweStream (). Archivo (Path+"/"+FileName))); // escríbalo vivo}} Catch (FileUploadException e) {E.PrintStackTrace (); }}} Almacenar archivos cargados en este lugar
Información de carga:
Resultados de carga:
Use la herramienta de carga de archivos Apache para lograr la carga de archivo 2 (resuelva el nombre de archivo confuso)
paquete cn.hncu.servlet; import java.io.file; import java.io.ioexception; import java.io.printwriter; import java.util.list; import java.util.uuid; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import; importar; importar; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; importar org.apache.commons.fileUpload.fileitem; import org.apache.commons.fileupload.fileuploadexception; import org.apache.commons.fileupload.disk.diskFileItemFactory; import org.apache.commons.fileUpload.servlet.servletFileUpload; import org.apache.commons.io.fileutils; class de clase pública upload2Servlet extiende httpservlet {public vhetget (hetget (hetts, requería, la clase pública upload. HttpServletResponse Respuesta) lanza ServletException, ioException {Response.SetContentType ("Text/Html"); // Si se trata de un formulario que contiene archivos cargados (POST2), el drama solo puede establecer la codificación en el nombre del archivo del archivo cargado (resuelva su código confuso chino) // pero no puede resolver el código chino de componentes de forma ordinaria en el modo Post2 PrintWriter Out = Response.getWriter (); out.println ("<! DocType html public/"-// w3c // dtd html 4.01 transitional // en/">"); out.println ("<html>"); out.println ("<Ethead> <title> un servlet </title> </head>"); out.println ("<body>"); out.print ("no es compatible con la carga ... out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); } public void dopost (httpservletRequest solicitud, respuesta httpservletreSponse) lanza ServletException, ioexception {// paso 1 // formulario ordinario (post1), la siguiente oración puede establecer la codificación del contenido del componente de la forma ordinaria (puede resolver su problema chino abarrotado). // Si se trata de un formulario que contiene archivos cargados (POST2), esta oración solo puede establecer la codificación en el nombre del archivo del archivo cargado (resuelva su código confuso chino). Pero no puede resolver el código confuso del componente de formulario ordinario (no puede configurar su codificación) // en el servidor, especifique un directorio para todos los archivos cargados string rath = getServletContext (). GetRealPath ("/upload"); System.out.println ("ruta:"+ruta); Archivo dir = nuevo archivo (ruta); if (! dir.exists ()) {dir.mkdirs (); } // Establecer el tamaño del búfer de archivo temporal-8k búfer, dirección de archivo temporal diskfileitemFactory f = new DiskFileItemFactory (1024*8, nuevo archivo ("d:/a")); // Super la herramienta ServletFileUpload upload = new ServLetFileUpload (f); upload.setFileSizeMax (1024*1024*5); // Establecer el archivo único cargado máximo en 5M upload.SetSizEmax (1024*1024*8); // Establezca la suma de todos los tamaños de archivo cargados a 8m // Use la herramienta de análisis para analizar {list <StilEitem> list = upload.parsequest (request); for (fileItem fi: list) {if ((fi.isformfield ())) {// Si es un componente de formulario normal: casilla de verificación, radio, contraseña ... // string desc = fi.getString (); System.out.println ("fi.getString ():"+fi.getString ()); // String de segundo paso desc = fi.getString ("UTF-8"); // Esta oración establece la codificación de contenido del componente de formulario ordinario System.out.println ("Después de codificar:"+Desc); } else {String ext = fi.getName (). Substring (fi.getName (). LastIndexOf (".")); //. Txt String uuid = uuid.randomuUid (). toString (). reemplazar ("-", ""); Cadena filename = uuid+ext; //fi.getInputStream () es la información de archivo real FileUtils.CopyInputStreamToFile (fi.getInputStream (), nuevo archivo (Path+"/"+FileName)); // escríbalo vivo}}} capt (fileuploadException e) {e.printstackAtRace (); }}}Información de carga:
Resultados de carga:
Use la herramienta de carga de archivos Apache para lograr la carga de archivo 3 (Desglose del archivo)
Optimizar el almacenamiento de archivos con el directorio hash:
El directorio hash es un método para optimizar el rendimiento del almacenamiento de archivos. Ya sea Windows o Linux, ya sea NTFS o Ext3, el número de elementos que se pueden acomodar en cada directorio es limitado.
No es que no se pueda guardar, pero cuando el número de proyectos es demasiado grande, la velocidad de indexación de archivos se reducirá.
Por lo tanto, es necesario sopesar cuántos archivos se deben guardar en un directorio. Ahorrar demasiado afectará el rendimiento, mientras que ahorrar muy poco causará demasiados directorios y desperdicio de espacio. Entonces, al guardar grandes lotes de archivos,
Hay un algoritmo que puede "romper" los archivos de manera más uniforme en diferentes subdirectorios para mejorar la velocidad de índice de cada nivel. Este algoritmo es hash. El MD5, SHA1, etc. comúnmente utilizado se puede usar como directorio hash. MD5 también se usa en mi sesión para obtener el primer y noveno dígito de SessionID, que constituye una ruta hash de dos niveles. Es decir, el sistema distribuye todos los archivos de sesión a 16 × 16 = 256 subdirectorios. Suponiendo que guardar 1000 archivos en cada directorio de Linux puede lograr la mejor relación de rendimiento de espacio, el sistema idealmente puede tener 256,000 archivos de sesión utilizados al mismo tiempo.
paquete cn.hncu.servlet; import java.io.file; import java.io.ioexception; import java.io.printwriter; import java.util.list; import java.util.uuid; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import; importar; importar; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; importar org.apache.commons.fileUpload.fileitem; import org.apache.commons.fileupload.fileuploadexception; import org.apache.commons.fileupload.progressListener; import org.apache.commons.fileupload.disk.diskFileItemFactory; importar org.apache.commons.fileUpload.servlet.servletfileUpload; importar org.apache.comons.fileutils; Httpservlet {public void doget (httpservletRequest solicitud, respuesta httpservletResponse) lanza ServletException, ioException {Response.SetContentType ("Text/Html"); // Si se trata de un formulario que contiene archivos cargados (POST2), el drama solo puede establecer la codificación en el nombre del archivo del archivo cargado (resuelva su código confuso chino) // pero no puede resolver el código chino de componentes de forma ordinaria en el modo Post2 PrintWriter Out = Response.getWriter (); out.println ("<! DocType html public/"-// w3c // dtd html 4.01 transitional // en/">"); out.println ("<html>"); out.println ("<Ethead> <title> un servlet </title> </head>"); out.println ("<body>"); // Obtén la pieza después del "?" Número en la URL en el método get // http: // localhost: 8080/servletdemo3/upload? name = jack & sex = macho string qstr = requit.getQueryString (); System.out.println ("QSTR:"+QSTR); // QSTR: name = Jack & Sex = Male out.print ("No admite obtener cargar ... ..."); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); } public void dopost (httpservletRequest solicitud, respuesta httpservletreSponse) lanza ServletException, ioexception {Response.SetContentType ("Text/Html; Charset = UTF-8"); PrintWriter out = Response.getWriter (); // 1 Anti-Black: el front-end de la protección se envía utilizando el método Post1 // método 1 /* string type = requit.getContentType (); if (! type.contains ("multipart/formy-data")) {out.println ("envío de formulario no soportado"); devolver; }*/// Método 2 boolean boo = servletFileUpload.IsmultipartContent (solicitud); if (! boo) {out.println ("envío de formulario no soportado"); devolver; } // Paso 1 // Formulario de forma ordinaria (POST1), la siguiente oración puede establecer la codificación del contenido del componente de formulario ordinario (puede resolver su problema chino de problemas confusos). // Si se trata de un formulario que contiene archivos cargados (POST2), esta oración solo puede establecer la codificación en el nombre del archivo del archivo cargado (resuelva su código confuso chino). Pero no puede resolver el código confuso del componente de formulario ordinario (no puede configurar su codificación) // en el servidor, especifique un directorio para todos los archivos cargados string rath = getServletContext (). GetRealPath ("/upload"); System.out.println ("ruta:"+ruta); Archivo dir = nuevo archivo (ruta); if (! dir.exists ()) {dir.mkdirs (); } // Establecer el tamaño del búfer de archivo temporal-8k búfer, dirección de archivo temporal diskfileitemFactory f = new DiskFileItemFactory (1024*8, nuevo archivo ("d:/a")); // Super la herramienta ServletFileUpload upload = new ServLetFileUpload (f); upload.setFileSizeMax (1024*1024*5); // Establecer el archivo único cargado máximo en 5M upload.SetSizEmax (1024*1024*8); // Establecer la suma máxima de todos los tamaños de archivo cargados es 8m // ▲ 4 Progress de carga escuchando upload.setProgressListener (new ProgressListener () {private doble pre = 0d; @anulación // Parámetro 1: ¿Cuántos bytes se han cargado de parámetro 2: cuántos bytes son el parámetro 3? Pitems) {Double d = 1.0*pbyteread/pcontentLength*100; // Use la herramienta de análisis para analizar {list <StilEitem> list = upload.parserequest (solicitud); for (fileItem fi: list) {if ((fi.isformfield ())) {// Si es un componente de formulario normal: casilla de verificación, radio, contraseña ... // string desc = fi.getString (); System.out.println ("fi.getString ():"+fi.getString ()); // String de segundo paso desc = fi.getString ("UTF-8"); // Esta oración establece la codificación de contenido del componente de formulario normal. } else {// Protect: filtre los componentes del archivo vacío que no han seleccionado if (fi.getSize () <= 0) {continuar; // Leer el siguiente archivo} System.out.println ("Tipo de contenido del archivo:"+fi.getContentTyPe ()); // Tipo de contenido de archivo: Text/sencillo.out.println ("Nombre del archivo:" Fi.getName ();); C: /users/adl1/desktop/a.txt string ext = fi.getName (). SubString (fi.getName (). LastIndexof (".")); //. Txt String uuid = uuid.randomuuid (). ToString (). Reemplazar ("-", "); Cadena filename = uuid+ext; // Directorio de archivos Breaking Technology String dir1 = Integer.toHexString (uuid.hashcode () & 0x0f); String dir2 = integer.toHexString ((uuid.hashcode () y 0xf0) >> 4); //fi.getInputStream () es la información de archivo real fileUtils.CopyInputStreamToFile (fi.getInputStream (), new File (Path+"/"+Dir1+"/"+Dir2+"/"+FileName)); // Escribido viva}}} Catch (FileUploadException e) {E.PRINTSTACTRACE (); }}}Romper el mensaje:
Romper los resultados:
Archivo 1:
Archivo 2:
Demostrar el principio del progreso de la carga
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.