1. Análisis del principio de carga de archivos
1. Los requisitos previos necesarios para la carga de archivos
a. El método del formulario debe ser publicado
b. La propiedad Enctype del formulario debe ser de tipo multipart/formulario.
Valor predeterminado de Enctype: Application/X-WWW-Form-URLEncoded
Función: diga al servidor al tipo MIME del texto de solicitud
aplicación/x-www-form-urlencoded: username = ABC & Password = 123
ServletRequest.getParameter (nombre de cadena); Este método es un método que lee específicamente este tipo
multipart/formularios de forma:
2. Utilice el componente Commons-FileUpload para cargar archivos
a. Copie el paquete jar: commons-filupload.jar commons-io.jar
b. Principio de implementación
3. Problema del código de basura
a. Código de basura de campos ordinarios
Fileitem.getString (string charset); La codificación debe ser consistente con el cliente
b. El nombre de archivo chino cargado está confuso.
request.setcharacterEncoding ("UTF-8"); La codificación debe ser consistente con el cliente
4. Implementación específica
El código para la recepción cargada.jsp es el siguiente
<%@ page lenguaje = "java" import = "java.util.*" pageEncoding = "utf-8"%> <! DocType html público "-// w3c // dtd html 4.01 transitional // en"> <html> <fead> <title> Cargue </title> <teta http-equiv = "pragma" content = "no-cache"> <meta http-equiv = "cache-confontrol" content = "no-cache"> <meta http-equiv = "expires" content = "0"> <!-<link rel = "stylesheet" type = "text/css" href = "styles.css">-> </head> <body> <body <body <body <body <body <body <body " Action = "$ {PageContext.Request.ContextPath}/Servlet/uploadServlet3" método = "post" enctype = "multipart/form-data"> name: <input name = "name"/> <Br/> file1: <input type = "file" name = "f1"/> <br/> file2: <input type = "file" name = "f2"/"f2"/"file" name = "f1"/> <BR/> file2: <input type = "file" name = "f2"/"f2"/"file" name = "f1"/> <BR/> file2: <input type = "file" name = "f2"/"f2" type = "enviar" value = "cargar"> </form> </body> </html>Código de servlet de fondo
paquete com.itheima.servlet; import java.io.file; import java.io.ioException; import java.io.printwriter; import java.io.usupportedencodingexception; import java.util.list; import java.util.uuid; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletreSponse; importar org.apache.commons.fileupload.fileitem; import org.apache.commons.fileupload.FileUploadBase;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.fileNameUtils; // explicación detallada de la clase pública uploadServlet3 extiende httpservlet {public void doget (httpServletRequest solicitud, respuesta httpServletResponse) lanza ServletException, ioexception {request.setcharacterEncoding ("UTF-8"); respuesta.setContentType ("text/html; charset = utf-8"); printWriter out = respuesta.getwriter (); system.out.print (request.getRemoteaddr ()); boolean ismultipart = ServletFileUpload.IsmultipartContent (request); if (! IsMultipart) {throle new runtimeException ("Por favor, verifique la propiedad de enchype de su formulario para confirmar que es multipart/formy-data");} diskFileItemFactory dfif = new DiskFileItemFactory (); servletfilepload Parser = new NewSer = new NewSer = neweN ServletFileUpload (dfif); // parser.setFileSizeMax (3*1024*1024); // Establezca el tamaño de una sola carga de archivo // parser.setsizeMax (6*1024*1024); // Límite de tamaño total al cargar múltiples listas de archivos <ememsitem> items = null; prueba {items = parser.parserequest (request);} catch (fileUploadBase.FileSizeLImitexEdEdException e) {out.write ("uploadFile excede 3m"); return;} catch (fileUploadbase.sizeLImitexExceedException e) {out.write ("Total File exede 6M"); {E.PrintStackTrace (); tirar nueva runtimeException ("Falta de contenido de carga de carga, intente nuevamente");} // Procese el contenido solicitado if (elementos! = null) {for (fileitem item: elementos) {if (item.isformfield ()) {ProcessFormField (item);} else {ProcessUploPloDField (item);}}} ProcessUploadfield (elemento de fileitem) {try {string filename = item.getName (); // if (fileName! = null &&! FileName.equals ("")) {filename = uuid.randomuuUid (). toString ()+"_"+fileUniL.getName (filename); // extension stression = FilenameUtils.getExtension (FileName); // mime type string contentType = item.getCententType (); if (contentType.startswith ("image/")) {// date ahora = new date (); // dateFormat df = new SimpleDateFormat ("yyyyyym-dd"); // // string bildDirectory Calcule el directorio de almacenamiento de acuerdo con el húsico de la cadena del nombre del archivo childDirectory = makeChildDirectory (getServletContext (). GetRealPath ("/web-inf/files/"), nombre de archivo); string storedirectoryPath = getServletContext (). Archivo (StoredIrectoryPath); if (! storedIrectory.Exists ()) {storedIrectory.mkdirs ();} system.out.println (filename); ite (new File (storedIrectoryPath+file.separator+fileName)); // delete archivo temporal}}} (excepción EXCEPCIÓN E) {SHOLE NewtimeException ("UpLoad Faller, por favor intente de nuevo"); Calcule el subdirectorio almacenado String privado MakeChildDirectory (string realPath, string filename) {int hashcode = filename.hashcode (); int dir1 = hashcode & 0xf; // tomar 1 ~ 4 bits int dir2 = (hashcode & 0xf0) >> 4; // tomar 5 ~ 8 bits directory = "" "" "" "" file = new File (RealPath, Directory); if (! File.Exists ()) file.mkdirs (); return Directory;} private Void ProcessFieldField (fileItem item) {String fieldName = item.getFieldName (); // Nombre de campo String FieldValue; intente {FieldValue = item.getString ("Utf-8");} Catch (ASuPPATEDEDEDEDEMPORTEDEM) New RuntimeException ("UTF-8 Coding no es compatible");} System.out.println (FieldName+"="+FieldValue);} public void dopost (httpservletRequest, httpServletreSponse respuesta) lanza servletException, ioexception {doget (solicitud, respuesta);}}}}}}}}}}}}}}}}}}}}5. Con respecto a los documentos temporales
a. Discofileitemfactory
public void setRepository (repositorio de archivos): establezca el directorio donde los archivos temporales se almacenan public void setsizethreshold (int SizethReshold): Establezca el tamaño de la memoria caché
b.
Al cargar archivos, use la transmisión IO para procesarlos usted mismo. Asegúrese de eliminar el archivo temporal después de que se cierre la transmisión. Fileitem.delete ()
Se recomienda usar: fileItem.Writer (archivo F). Los archivos temporales se eliminarán automáticamente.
6. Limite el tamaño del archivo
a.
ServletFileUpload.SetFileSizeMax (3*1024*1024); // Establezca el tamaño de una carga de archivo único
b.
ServletFileUpload.SetSizEmax (6*1024*1024); // Límite de tamaño total al cargar varios archivos
El anterior es el código de ejemplo para la carga de archivo de implementación de FileUpload de Commons introducido por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!