Primero hablemos sobre los principios de carga y descarga de la implementación de instancias de Struts2:
Struts 2 se carga a través del archivo FileUpload de Commons.
Commons FileUpload usa el interceptor FileUpload para vincular el archivo a una instancia de acción guardando los datos de HTTP en una carpeta temporal, y luego Struts usa el interceptor FileUpload. Por lo tanto, podemos operar los archivos cargados por el navegador de manera local.
Implementación específica :
1. Crear página index.jsp
<Body> <S: Form Action = "upload" método = "post" thema = "simple" enctype = "multipart/form-data"> <table align = "center"> <tr> <tr> <td> seleccione el archivo de carga </td> <td id = "más"> <s: file name = "archivo"> </s: archivo> <input type = "valor =" add más .. "onclick =" agregar () </tr> <tr> <tr> <td> <s: enviar type = "button" value = "Subt" onClick = "return checkf ()"/> </td> <td> <s: reinse value = "reet"> <//s: reet> </td> </tr> </table> <topely <table align = "Center"> <tr> <tr> href = "<s: url value = 'download.action'> <s: param name = 'filename'> test.txt </s: param> </s: url>"> descargar </a> </td> </tr> </table> </s: form> </body>
Crear página resultado.jsp
<body> <s: form> <div style = "border: 1px sólido negro"> archivo cargado con éxito: <br> <ul style = "list-style-type: decimal"> <s: iterator value = "#request.fileName" id = "file" status = "status"> <li> <s: propiedad/> </si> </s> </s: itherator> </ul> </divs> </stati
Por supuesto, no olvide agregar referencia de etiqueta Struts2 en cada página < %@taglib prefix = "s" uri = "/struts-tags" %>
2. Cree un archivo updown.js y haga referencia en index.jsp
función checkf () {var files = document.getElementsByName ("archivo"); if (archivos [0] .value.length! = 0) {return true; } else {alerta ("Seleccione el archivo"); devolver falso; }} function addmore () {var td = document.getElementById ("más"); var br = document.createElement ("br"); var input = document.createElement ("entrada"); var button = document.createElement ("entrada"); input.type = "archivo"; input.name = "archivo"; Button.Type = "Button"; botón.value = "eliminar"; Button.OnClick = function () {td.removechild (br); td.removechild (entrada); td.removechild (botón); } td.appendChild (Br); td.appendChild (entrada); td.appendChild (botón); } 3. Crear updownloadAction.java
paquete com.action; import java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.fileutputstream; import java.io.inputStream; import java.io.outputStream; import java.io.unsupportedencodingexception; importar java. javax.servlet.http.httpservletRequest; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.servletactionContext; public class updOwnlowAction extiende ActionSupport {privado estático final de suero longUnversionUid = 1l; Lista privada <Sche> file; // correspondiente a las etiquetas de archivo en JSP Private List <String> fileFileName; // private list <string> fileContentType; // private string fileName; // Obtener el parámetro PRAM en jsp @suppressWarnings ("desprecio") // archivo public string String String String String String String String String String String String String String RootFiile () lanza la excepción de la excepción {String {String Root = = = ServletactionContext.getServletContext (). GetRealPath ("/upload"); // cargar ruta System.out.println (root); InputStream InputStream; Archivo destfile; OutputStream OS; for (int i = 0; i <file.size (); i ++) {inputStream = new FileInputStream (file.get (i)); destfile = nuevo archivo (root, this.getFileFileName (). get (i)); OS = nuevo FileOutputStream (DestFile); byte [] buffer = new Byte [400]; int longitud = 0; while ((longitud = inputStream.read (buffer))> 0) {os.write (buffer, 0, longitud); } inputStream.Close (); os.close (); } HttpservletRequest request = servletactionContext.getRequest (); request.setAttribute ("FileName", fileFileName); devolver el éxito; } // El archivo descarga public EnputStream GetdownloadFile () lanza FileNotFoundException, UnsupportedEncodingException {System.out.println (getFileName ()); // Si el nombre del archivo de descarga es chino, realice la conversión de codificación de caracteres servletactionContext.getResponse (). Setheader ("Content-Disposition", "Attachment; FileName =" + java.net.urlencoder.encode (FileName, "UTF-8"); InputStream inputStream = new FileInputStream ("f:/" // use la ruta absoluta para descargar el archivo "test.txt" de esta ruta + this.getFileName ()); System.out.println (InputStream); return inputStream; } // Descargar public String downloadFile () lanza la excepción {return éxito; } public String getFileName () lanza UnspportedEncodingException {return FileName; } public void setFileName (String FileName) lanza UnspportedEncodingException {this.fileName = new String (FileName.getBytes ("ISO8859-1"), "UTF-8"); }}Nota: Se han omitido los métodos GET y SET del atributo.
Cuarto, finalmente el archivo de configuración
1. Configuración web.xml
<filter> <filter-name> struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.filterdispatcher </filter-class> </filtre> <filter-mapping> <filter-name> struts2 </filter-name> <url-pattern>/*</ url-pattern> </filter-mapping>
2. Struts.xml Configuración
<Struts> <Constant name = "Struts.i18n.encoding" value = "utf-8"> </ constant> <constant name = "struts.multipart.savedir" value = "f:/"> </constant> <paquete nam. name = "Success">/jsp/result.jsp </ resultado> <interceptor-ref name = "fileUpload"> <!-MaximumSize (opcional)-la longitud máxima del archivo cargado a la acción permitida por este interceptor (en unidades de byte). Tenga en cuenta que este parámetro no tiene nada que ver con las propiedades definidas en WebWork.Properties. El valor predeterminado es 2MB-> <param name = "maximumSize"> 409600 </amam> <!-permitido types (opcional)-una lista separada por comas de tipos de contenido (como text/html). Estas listas son ContentTypes permitidas por este Interceptor para pasar a la acción. Si no se especifica, se permite cualquier tipo de carga .--> <param name = "loodypes"> text/sencillo </param> </interceptor-ref> <interceptor-ref name = "defaultStack"> </interceptor-ref> </action> <Action name = "descargar" método = "descargar file"> <resultado name = "éxito" type = "stream"> <!-especificar archivo de descarga de tipos de descarga/octusta de descarga/statting-sttream puede descargar -> <param name = "ContentType"> Application/txt; </param> <!-Especifique el nombre del archivo descargado y el método de visualización, pero preste atención al código confuso de nombres chinos. La solución es: procesamiento de codificación-> <!-ContentDisposition es el método de procesamiento de descarga de archivos, que incluye en línea y archivos adjuntos. El valor predeterminado está en línea. Al usar archivos adjuntos, se configura de la siguiente manera: adjunto; filename = "filename". -> <param name = "ContentDisposition"> ap. </paquete> </truts>
Se implementan una carga múltiple STRUTS2 simple y una descarga de un solo archivo .
Lo anterior se trata de este artículo, espero que sea útil para el aprendizaje de todos.