La carga de archivos es muy común en las aplicaciones web. Es muy fácil implementar la función de carga de archivos en el entorno JSP, porque hay muchos componentes de carga de archivos desarrollados en Java en Internet. Este artículo lleva el componente Commons-FileUppload como un ejemplo para agregar la función de carga de archivos a las aplicaciones JSP.
El componente Common-FileUpload es uno de los proyectos de código abierto de Apache y se puede descargar desde http://jakarta.apache.org/commons/fileupload/.
Este componente le permite cargar uno o más archivos a la vez y puede limitar el tamaño del archivo.
Después de descargar, descomprima el paquete zip y copie Commons-FileUpload-1.0.jar a las Apps web de Tomcat en su WebAppweb-Inflib. Si el directorio no existe, cree su propio directorio.
Cree un nuevo servlet: upload.java para la carga de archivo:
import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; importar org.apache.commons.fileUpload.*; La carga de clase pública se extiende httpservlet {private String uploadPath = "c: cargar"; // Directorio para cargar archivos Cadena privada TEMPPATH = "C: uploadTMP"; // directorio de archivos temporal public void dopost (solicitud httpservletrequest, httpservletreponse respuesta) lanza ioexception, servletException {}}En el método dopost (), cuando el servlet recibe la solicitud posterior emitida por el navegador, realiza la carga de archivos. Aquí está el código de muestra:
Public void dopost (solicitud httpservletRequest, respuesta httpservletreSponse) lanza ioexception, servletException {try {diskfileUpload fu = new DiskFileUpload (); // Establecer el tamaño máximo del archivo, aquí está 4mbfu.setsizeMax (4194304); // Establecer el tamaño del búfer, aquí está 4KBFU.SetSizethreshold (4096); // Establecer el directorio temporal: Fu.SetRepositoryPath (TEMPPATH); // Obtener todos los archivos: lista fileItems = FU.Parserequest (solicitud); Iterador i = fileItems.Iterator (); // procesa cada archivo en secuencia: while (i.hasnext ()) {fileItem fi = (fileItem) I.Next (); // Obtener el nombre del archivo, el nombre del archivo incluye la ruta: String filename = fi.getName (); // Aquí puede registrar la información del usuario y el archivo // ... // escribir en el archivo, el nombre de archivo tentativo es A.txt, y el nombre del archivo se puede extraer del nombre de archivo: fi.write (nuevo archivo (uploadpath + "a.txt")); }} Catch (Exception e) {// Puede saltar a la página de error}}Si desea leer la carpeta de carga especificada en el archivo de configuración, puede ejecutarla en el método init ():
public void init () lanza ServletException {uploadPath = .... temppath = .... // Si la carpeta no existe, se creará automáticamente: if (! new File (uploadPath) .IsDirectory ()) nuevo archivo (uploadPath) .mkdirs (); if (! new File (TEMPPATH) .IsDirectory ()) Nuevo archivo (TEMPPATH) .MKDIRS (); }Compile el servlet, tenga cuidado de especificar el classpath, asegúrese de incluir comunes-supload-1.0.jar y tomcatcommonlibservlet-api.jar.
Configure el servlet, use el bloc de notas para abrir TomCatWebApps para su webappweb-Infweb.xml y crear uno nuevo si no.
Las configuraciones típicas son las siguientes:
〈? Xml versión = "1.0" encoding = "ISO-8859-1"?〉 〈! DOCTYPE WEB-APublic "-// Sun Microsystems, Inc.//dtd Aplicación web 2.3 // en "" http://java.sun.com/dtd/web-app_2_3.dtd "> 〈web-app> 〈servlet> 〈servlet-name> cargar 〈/servlet-name> 〈servlet-class> cargar 〈/s Ervlet-Class> 〈Servlet-Mapping 〈Servlet-Name> Subir 〈/Servlet-Name> 〈URL-Pattern〉/FileUpload 〈/URL-Pattern 〈/Servlet-Maping 〈/Web-App 〈
Después de configurar el servlet, inicie TomCat y escriba una prueba HTML simple:
〈Form Action = "FileUpload" Method = "Post" enctype = "multipart/form-data" name = "form1"> 〈input type = "file" name = "file"> 〈type de entrada = "enviar" name = "enviar" valor = "cargar"> 〈/form>
Nota Action = "FileUpload" donde FileUpload es el patrón URL especificado al configurar el servlet.
Aquí está el código para un langostino:
Esta carga es mucho más fácil de usar que Smartupload. Fue completamente creado por mí bytes uno por uno, a diferencia de Smartupload que tiene muchos errores.
Método de llamadas:
Cargar up = new upload (); up.init (solicitud); /** puede llamar a setsavedir (cadena saveDir); Establezca la ruta Guardar y llame a SetMaxFilesize (tamaño largo) para establecer el byte máximo del archivo cargado. Llame a SettagFileName (String) para establecer el nombre del archivo después de la carga (solo válido para el primer archivo)*/up. uploadFile ();
Luego cadena [] nombres = up.getFileName (); Obtenga el nombre de archivo cargado, la ruta absoluta del archivo debe ser
Directorio guardado Savedir+"/"+nombres [i];
Puede obtener el texto cargado o hacia arriba. GetParametervalues ("archivado") a través de UP.getParameter ("campo");
Obtenga los valores de los campos con el mismo nombre, como múltiples casillas de verificación.
Prueba con los demás tú mismo.
El código fuente es el siguiente: __________________________________________________________________________
paquete com.inmsg.beans; import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; Clase pública cargada {string private savedir = "."; // ruta para guardar el archivo de cadena privada contentType = ""; // Documento Tipo de cadena privada charset = ""; // Conjunto de personajes ArrayList TMPFileName = new ArrayList (); // Estructura de datos temporal para almacenar nombres de archivos Parámetro de hashtable privado = new Hashtable (); // Estructura de datos que almacena nombres y valores de parámetros contexto privado ServletContext; // Contexto del programa, utilizado para inicializar la solicitud privada de HttpServletRequest; // instancia utilizada para pasar en el objeto de solicitud privado cadena límite = ""; // separador de datos de memoria private int len = 0; // Longitud de bytes realmente se lee desde el interno cada vez que la consulta privada de cadena privada; privado int count; // número total de archivos cargados cadena privada [] nombre de archivo; // matriz de nombre de archivo cargada Private Long maxFilesize = 1024 * 1024 * 10; // bytes de carga máximo de archivo; String private tagFileName = ""; Public final void init (solicitud httpservletrequest) lanza ServletException {this.request = request; límite = request.getContentType (). Substring (30); // Obtenga el delimitador de datos en memoria QueryString = request.getQueryString (); } public String getParameter (String s) {// utilizada para obtener el valor de parámetro del campo especificado, anular request.getParameter (string s) if (parameter.isEmpty ()) {return null; } return (string) parameter.get (s); } public String [] getparametervalues (string s) {// Se utiliza para obtener la matriz de parámetros especificada con el mismo campo de nombre, anular request.getParametervalues (string s) arrayList al = new ArrayList (); if (parameter.isEmpty ()) {return null; } Enumeración e = parameter.keys (); while (e.hasmoreelements ()) {string key = (string) e.nextElement (); if (-1! = key.indexof (s + "|||||||||||") || key.equals (s)) {al.add (parameter.get (key)); }} if (al.size () == 0) {return null; } String [] value = new String [al.size ()]; for (int i = 0; i 〈value.length; i ++) {valor [i] = (string) al.get (i); } valor de retorno; } public String getQueryString () {return QueryString; } public int getCount () {return Count; } public String [] getFileName () {return FileName; } public void setMaxFilesize (tamaño largo) {maxfilesize = size; } public void settAgFileName (String fileName) {tagFileName = fileName; } public void setSavedir (String Savedir) {// Establezca la ruta para guardar para cargar el archivo this.savedir = savedir; Archivo testDir = nuevo archivo (saveDir); // Para asegurarse de que el directorio exista, si no hay, cree el directorio if (! TestDir.exists ()) {testdir.mkdir (); }} public void setCharset (String Charset) {// Establecer el caracteres SET este.charset = charset; } public boolean uploadFile () lanza ServletException, ioException {// Método de carga llamado por el usuario setCharset (request.getCharacterEncoding ()); return uploadFile (request.getInputStream ()); } private boolean uploadfile (servletInputStream ServletInputStream) lanza // El método principal para obtener datos de almacenamiento central ServletException, ioException {string line = null; byte [] buffer = new Byte [256]; while ((line = readline (buffer, servletInputStream, charset))! = null) {if (line.startswith ("content-disisposition: form-data;"))) {int i = line.indexof ("filename ="); if (i〉 = 0) {// Si hay nombre de archivo = en la descripción en un delimitador, significa que es el contenido codificado de la cadena de archivo fname = getFileName (línea); if (fname.equals ("")) {continuar; } if (count == 0 && tagFileName.length ()! = 0) {string ext = fname.substring ((fname.lastIndexof (".") + 1)); fname = tagFileName + "." + ext; } tmpfileName.Add (fname); contar ++; while ((line = readline (buffer, servletInputStream, charset))! = null) {if (line.length () 〈= 2) {break; }} Archivo f = nuevo archivo (saveDir, fname); FileOutputStream dos = nuevo FileOutputStream (f); tamaño largo = 0l; while ((line = readline (buffer, servletInputStream, null))! = null) {if (line.indexof (límite)! = -1) {break; } tamaño += len; if (size〉 maxfilesize) {tire nueva IOException ("El archivo excede" + maxfilesize + "byte!"); } dos.write (buffer, 0, len); } dos.close (); } else {// de lo contrario es el contenido de la tecla de cadena de codificación de campo = getKey (línea); Valor de cadena = ""; while ((line = readline (buffer, servletInputStream, charset))! = null) {if (line.length () 〈= 2) {break; }} while ((line = readline (buffer, servletinputstream, charset))! = null) {if (line.indexof (límite)! = -1) {break; } valor += línea; } put (key, value.trim (), parámetro); }}} if (QueryString! = NULL) {String [] cada = Split (QueryString, "&"); for (int k = 0; k 〈cada uno.length; k ++) {string [] nv = split (cada uno [k], "="); if (nv.length == 2) {put (nv [0], nv [1], parámetro); }}} filename = new String [tmpFileName.size ()]; for (int k = 0; k 〈filename.length; k ++) {filename [k] = (string) tmpfilename.get (k); // Vierta el nombre del archivo temporal en ArrayList en los datos para que el usuario llame} if (filename.length == 0) {return false; // Si los datos del nombre de archivo están vacíos, significa que no se carga ningún archivo} return true; } private void put (clave de cadena, valor de cadena, hashtable ht) {if (! ht.containskey (key)) {ht.put (clave, valor); } else {// Si ya tiene una clave con el mismo nombre, debe cambiar el nombre de la clave actual. Al mismo tiempo, tenga cuidado de no formar el mismo nombre que la tecla Try {Thread.CurrentThread (). Sleep (1); // Para no generar dos teclas idénticas en la misma MS} Catch (Exception e) {} Key += "|||||||||||" + System.CurrentTimemillis (); ht.put (clave, valor); }}/* Llame ServletInputStream.Readline (byte [] b, int offset, longitud), que lee una línea desde la secuencia ServletInputStream a la matriz de BYTE especificada. Para asegurarse de que pueda acomodar una línea, el byte [] B no debe ser inferior a 256. En la línea de lectura reescrita, se llama a una variable de miembro al número real de bytes leídos (algunas líneas son inferiores a 256). Al escribir el contenido del archivo, el byte de la longitud de LEN debe escribirse desde la matriz de bytes en lugar de la longitud completa del byte []. Sin embargo, el método reescrito devuelve una cadena para analizar el contenido real y no puede devolver el LEN, por lo que LEN se establece como una variable miembro y le asigna la longitud real cada vez que la operación de lectura. Es decir, al procesar el contenido del archivo, los datos deben devolverse en forma de cadena para analizar las marcas de inicio y finalización, y también se escriben en la secuencia de salida del archivo en forma de byte [] al mismo tiempo. */private string readline (byte [] lineByte, servletInputStream ServletInputStream, String Charset) {try {Len = ServLetInputStream.Readline (LineByte, 0, LineByte.length); if (len == -1) {return null; } if (charset == null) {return new String (lineByte, 0, len); } else {return new String (LineByte, 0, len, charset); }} catch (excepción _ex) {return null; }} String private getFileName (línea de cadena) {// separa el nombre del archivo de la cadena de descripción if (line == null) {return ""; } int i = line.IndexOf ("FileName ="); line = line.substring (i + 9) .trim (); i = line.lastIndexof (""); if (i 〈0 || i〉 = line.length () - 1) {i = line.lastIndexof ("/"); if (line.equals ("" "")) {return ""; } if (i 〈0 || i〉 = line.length () - 1) {línea return; }} return line.substring (i + 1, line.length () - 1); } private String getKey (línea de cadena) {// separa el nombre de campo de la cadena de descripción if (line == null) {return ""; } int i = line.IndexOf ("name ="); line = line.substring (i + 5) .trim (); return line.substring (1, line.length () - 1); } public static string [] split (string strob, string mark) {if (strob == null) {return null; } StringTokenizer st = new StringTokenizer (Strob, Mark); ArrayList tmp = new ArrayList (); while (St.hasmoretokens ()) {tmp.add (St.NextToken ()); } String [] strarr = new String [tmp.size ()]; for (int i = 0; i 〈tmp.size (); i ++) {strarr [i] = (string) tmp.get (i); } return strrr; }} La descarga es en realidad muy simple. Mientras lo procese de la siguiente manera, no se producirá ningún problema. Descargar public void (String FilePath, HttpServletResponse Respuesta, boolean isonline) lanza la excepción {archivo f = nuevo archivo (filePath); if (! f.exists ()) {Response.sendError (404, "¡Archivo no encontrado!"); devolver; } BufferedInputStream BR = new BufferedInputStream (nuevo FileInputStream (f)); byte [] buf = nuevo byte [1024]; int len = 0; respuesta.reset (); // es muy importante si (isonline) {// ononopen método url u = new url ("archivo: ///"+filepath); respuesta.setContentType (U.OpenConnection (). GetContentType ()); respuesta.setheader ("Disposición de contenido", "inline; filename ="+f.getName ()); // El nombre del archivo debe codificarse como UTF-8} else {// Pure Download Method Response.SetContentType ("Aplicación/X-MSDload"); respuesta.setheader ("Disposición de contenido", "Adjunto; FileName =" + F.getName ()); } OutputStream out = Response.getOutputStream (); while ((len = br.read (buf))〉 0) out.write (buf, 0, len); br.close (); out.close (); }