Cuando se trabaja en sistemas B/S, generalmente implica cargar archivos y descargar archivos. Antes de conectarnos al marco Struts2, usamos el componente FileUpload del subproyecto Commons en Apache para cargar archivos. Sin embargo, si hacemos eso, el código se ve engorroso e inflexible. Después de aprender Struts2, STRUTS2 proporciona un mejor mecanismo de implementación para la carga y descarga de archivos. Aquí explicaré el código fuente para la carga de archivos individuales y la carga de múltiples archivos. Aquí necesitamos importar dos archivos JAR cargados por descarga de archivos, uno es Commons-FileUpload-1.2.2.Jar, y el otro es Commons-io-2.0.1.jar.
Struts2 Single File Carga:
En primer lugar, hay una página de carga de archivos JSP. Esto es relativamente simple, es un formulario con un cuadro de carga de archivo.
< También está el atributo Enctype. Este atributo debe escribirse como multipart/formy-data, de lo contrario, se cargará en el servidor en texto binario-> <form de acción = "fileUpload.action" método = "post" enctype = "multipart/form de formularios"> nombre de usuario: <input type = "text" name = "userneNeM"> <BR> File: <input type = "Nombre de archivo =" File "> <Br> <input type =" Subsit "Subsit" Subsit " </form>
El siguiente es la parte de UuploadAction del código. Debido a que Struts2 proporciona un buen mecanismo de pasantía para cargar y descargar, solo necesitamos escribir muy poco código en acción:
Public Class FileUploadaction extiende ActionSupport {private String UserName; // Tenga en cuenta que el archivo no se refiere al archivo en sí cargado por el JSP frontal, sino el archivo cargado para almacenarlo en el archivo privado de la carpeta temporal; // El nombre del archivo enviado FileFileName de cadena privada; // El tipo de MIME de la cadena privada FileContentType de cadena privada; public String getUsername () {return UserName; } public void setUsername (String UserName) {this.Username = username; } Public File getFile () {File return; } public void setFile (archivo de archivo) {this.file = file; } public String getFileFileName () {return FileFileName; } public void setFileFileName (String fileFileName) {this.fileFileName = fileFileName; } public String getFileContentType () {return fileContentType; } public void setFileContentType (string fileContentType) {this.fileContentType = fileContentType; } @Override public String Execute () lanza la excepción {String root = servletactionContext.getServletContext (). GetRealPath ("/upload"); InputStream es = nuevo FileInputStream (archivo); OutputStream OS = nuevo FileOutputStream (nuevo archivo (root, fileFileName)); System.out.println ("fileFileName:" + fileFileName); // Debido a que el archivo es un archivo almacenado en una carpeta temporal, podemos imprimir su nombre de archivo y ruta de archivo para ver si es el mismo que el archivo de archivo anterior System.out.println ("file:" + file.getName ()); System.out.println ("archivo:" + file.getpath ()); byte [] buffer = new Byte [500]; int longitud = 0; while (-1! = (longitud = is.read (buffer, 0, buffer.length))) {os.write (buffer); } os.close (); is.close (); devolver el éxito; }}En primer lugar, debemos estar claro que el archivo aquí no se refiere realmente al archivo cargado por JSP. Cuando se carga el archivo, Struts2 buscará primero la ubicación de almacenamiento especificada por Struts.multipart.Savedir (esto está en default.properties). Podemos crear un nuevo archivo de propiedad Struts.Properties para especificar la ubicación de almacenamiento de archivos temporales. Si no se especifica, el archivo se almacenará en Apache-Tomcat-7.0.29/Work/Catalina/Directorio/Directorio de Tomcat. Luego podemos especificar la ubicación de almacenamiento después de cargar el archivo y simplemente escribirlo en la transmisión a través de la transmisión de salida. En este momento, podemos ver el archivo que cargamos en la carpeta.
Después de subir el archivo, todavía necesitamos descargarlo. De hecho, el principio de descargar Struts2 es muy simple. Es para definir una secuencia de entrada y luego escribir el archivo en el flujo de entrada. La configuración de clave aún es configurarla en el archivo de configuración de Struts.xml:
El código de la carga de la carga de archivo es el siguiente:
public class FileDownloadAction extiende ActionSupport {public inputStream getdownloadfile () {return servletactionContext.getServletContext (). GetResourceasStream ("Libro de carga/dirección 4 de septiembre de 2012.xls"); } @Override public String Execute () lanza la excepción {return éxito; }}Veamos que esta acción solo define un flujo de entrada y luego le proporciona un método getter. A continuación, echemos un vistazo al archivo de configuración de Struts.xml:
<Action name = "FileDownload"> <resultado name = "Success" type = "stream"> <param name = "contentDisposition"> adjunta; filename = "Libro de direcciones 4 de septiembre de 2012.xls" </param> <param name = "inputName"> downloadfile </param> </resultado> </action>
Hay varias cosas a las que debemos prestar atención en el archivo de configuración de Struts.xml. En primer lugar, el tipo de resultado. En el pasado, definimos una acción. Básicamente, no escribimos el atributo de tipo en el resultado, porque el valor predeterminado es solicitar el reenvío (despachador). Además de este atributo, generalmente hay valores como la redirección (redirección). Aquí, debido a que estamos usando la descarga de archivos, el tipo debe definirse como tipo de transmisión, diciendo la acción. Este es el resultado de la descarga del archivo. Generalmente hay subelementos de param en el elemento de resultado. Esto se usa para establecer los parámetros al descargar el archivo. E Esta propiedad es para obtener el flujo de entrada de archivo en acción. El nombre debe ser el mismo que el atributo de flujo de entrada en acción. Entonces el atributo ContentDisposition es el atributo ContentDisposition. Esta propiedad generalmente se usa para especificar cómo queremos procesar el archivo descargado. Si el valor es adjunto, aparecerá un cuadro de descarga, lo que permite que el usuario elija si descargar. Si este valor no está configurado, el navegador primero verificará si abrir el archivo descargado. Si puede, abrirá directamente el archivo descargado (por supuesto, esto no es lo que necesitamos). Otro valor es el nombre de archivo, que es el nombre de descarga del archivo solicitado por el archivo al descargar. Después de configurar esta información, podemos implementar la función de descarga de archivos.
Struts2 Múltiples archivos Carga :
De hecho, el principio de carga de múltiples archivos es el mismo que la carga de archivo único. Una sola carga de archivo es un solo archivo, y se carga una matriz de recopilación <archivo> o un archivo [] []. Primero, echemos un vistazo al código de la parte front-end JSP. Aquí utilicé jQuery para implementar la adición de archivos dinámicos y los cuadros de descarga de eliminación dinámica:
<script type = "text/javaScript" src = "script/jQuery-1.8.1.js"> </script> <script type = "text/javascript"> $ (function () {$ ("#botón"). Click (function () {var html = $ ("<input type = 'file' name = 'file'>"); var button = $ ("" Type de entrada = 'Button =' Button '' 'Button' 'Button value = 'delete'> <br> "); $ ("#Body Div "). Append (html) .Append (botón); Button.Click (function () {Html.remove (); Button.remove ();})})}) </script> </head> <boder Id =" Body "<Form Action =" fileuplaad2.Action "Método" Método "Método" enctype = "multipart/form-data"> username: <input type = "text" name = "username"> <br> file: <input type = "file" name = "file"> <input type = "button" value = "add" id = "botón"> <br> <div> </div> <input type = "enviar" valor = "enviar"> </form> </body> Los nombres de los archivos deben llamarse archivos, y luego el código de acción para cargar varios archivos es el siguiente:
Public Class FileUploadAction2 extiende ActionSupport {Private String UserName; // Aquí utilizamos la lista para almacenar archivos cargados. El archivo también se refiere a archivos temporales en carpetas temporales, en lugar de los archivos realmente cargados de la lista privada <ch. Archivo> Archivo; // Esta lista almacena el nombre del archivo, correspondiente al archivo en la lista <Sche> Lista privada <String> FileFileName; Lista privada <String> fileContentType; public String getUsername () {return UserName; } public void setUsername (String UserName) {this.Username = username; } Lista pública <Schil> getFile () {archivo return; } public void setFile (list <chile> file) {this.file = file; } Lista pública <String> getFileFileName () {return FileFileName; } public void setFileFileName (List <String> fileFileName) {this.fileFileName = fileFileName; } Lista pública <String> getFileContentType () {return fileContentType; } public void setFileContentType (list <string> fileContentType) {this.fileContentType = fileContentType; } @Override public String Execute () lanza la excepción {String root = servletactionContext.getServletContext (). GetRealPath ("/upload"); for (int i = 0; i <file.size (); i ++) {inputStream is = new FileInputStream (file.get (i)); OutputStream OS = nuevo FileOutputStream (nuevo archivo (root, fileFileName.get (i))); byte [] buffer = new Byte [500]; @Suppleswarnings ("no usado") int longitud = 0; while (-1! = (longitud = is.read (buffer, 0, buffer.length))) {os.write (buffer); } os.close (); is.close (); } return éxito; }}Esto también lo escribe en una transmisión de salida, para que podamos ver múltiples archivos cargados en la carpeta
La siguiente descarga del archivo es exactamente la misma que la descarga del archivo justo ahora, y lo mismo es Struts.xml, por lo que no la repetiré aquí.
Resumen: En general, el mecanismo de carga y descarga de archivos proporcionado por Struts2 simplifica mucho de nuestro código. Podemos usar este mecanismo en proyectos futuros. También podemos usar el componente FileUpload para cargar archivos. ¡Todo esto está determinado por las preferencias personales!
Solo hay mucho contenido sobre las funciones de carga y descarga de archivos en Javaweb, gracias por su lectura.