Junto al artículo anterior:
2. Carga y descarga de archivos
Tres trucos desarrollados por Struts2, página JSP - Archivo de configuración Struts2.xml y acción de clase de acción
Archivo de carga Requisito previo:
El método del formulario debe estar publicado
El enctype del formulario debe ser multipart/formulario de datos
Proporcione el campo de entrada de carga de tipo = "archivo"
Algunas reglas para el soporte de Struts para las cargas de archivos
1. Carga de archivo único
Pasos de desarrollo:
1) Agregue Commons-FileUpload-1.2.1.jar y commons-io-1.3.2.jar en Web-INF/lib. Estos dos archivos se pueden descargar desde http://commons.apache.org/
2) Paso 2: Escribir upcile.jsp y configure el enchado de la tabla de formulario en: "multipart/formy-data", como sigue:
<%@ page lenguaje = "java" import = "java.util.*" pageEncoding = "utf-8"%> <%@ taglib uri = "/struts-tags" prefix = "s"%> <body> <s: Actionerror/> <hr/> <s: fielderror> </s: Fielderror> <Form Form Action = "$ {PageContext.Request.ContextPath} /upload1.Action" Method = "post" enctype = "multipart/form de formularios"> <!-Pasando en mime-> username: <input type = "text" name = "username"/> <br/> beautiful: <input type = "nombre =" foto = "foto"/> <br/> <iny type " valor = "cargar"/> </form> </body>Error de la página de error de escritura.jsp
<Body> El servidor está ocupado, intente nuevamente después de un tiempo. </body>
éxito.jsp
<Body> Sube con éxito </body>
3) Escribir la clase UploadAction1: Agregue atributos a la clase de acción, y los atributos corresponden al nombre del campo Archivo en el formulario:
paquete com.itheima.actions; import java.io.file; import java.io.ioException; import org.apache.commons.io.fileUtils; import org.apache.struts2.servletactionContext; import.opensymphony.xwork2.ActionSupport; // Fallado: Public Class UpLoadAction1 Extenss ActionsUppportt {private stingsppoppplayame; Foto de archivo privado; // De acuerdo con el nombre del campo de carga del formulario. El tipo es tipo de archivo String private PhotOfileName; // Cargar Nombre del archivo Private String PhotocontentType; // Cargar el archivo Mime Tipo // omitir los métodos de Getter and Setter String public String upload () {System.out.println (PhotOfileName+":"+PhotocontentType); // campo ordinario: system.out.println (nombre de usuario); // Cargo de carga: cargar en una carpeta. Guárdelo en el directorio de imágenes de la aplicación String realPath = servletactionContext.getServletContext (). GetRealPath ("/Images"); Directorio de archivos = nuevo archivo (realPath); if (! Directory.Exists ()) {Directory.MkDirs (); } try {fileUtils.copyFile (foto, nuevo archivo (directorio, PhotOfileName)); devolver el éxito; } catch (ioException e) {E.PrintStackTrace (); Error de retorno; }}}Agregue la siguiente configuración al archivo Struts.xml
<Action name = "upload1" método = "upload"> <interceptor-ref name = "defaultStack"> <param name = "fileUpload.AnlowedTypes"> image/jpeg, image/png </amam> <parámina = "fileupload.allowedExtensionsSet"> jpg, jpeg, png </param> </interceptor-ref- <resultado> /success.jsp </ resultado> <resultado name = "error">/error.jsp </resultado> <resultado name = "input">/index.jsp </resultado> </solcion>
Análisis principal:
a. El Interceptor FileUpload es responsable de manejar las operaciones de carga de archivos. Es un miembro de la pila de interceptor predeterminada predeterminada. El interceptor tiene 3 propiedades que se pueden establecer.
• Máximo de tamaño: la longitud máxima del archivo cargado (en bytes), el valor predeterminado es 2 mb
• Types permitidos: los tipos que permiten cargar archivos, separados por comas.
• Textensiones permitidas: permite cargar extensiones de archivos. Estas 3 propiedades se pueden sobrescribir en el archivo Struts.xml al separar la comisión cada extensión.
b. La carga de archivos que excede el tamaño o ilegalmente causará un error (gire a una vista de entrada)
aprobar:
<S: ActionError/> <S: Feilderror/> Sugerencia para mostrar el mensaje de error
do. Cambiar el mensaje de error de error a la versión china: con la ayuda de archivos de recursos de mensajes internacionales
Si el error es causado por la configuración de los parámetros predeterminados globales, es mejor usar el archivo de recursos de mensajes globales.
El archivo de recursos de solicitud predeterminado para Struts2: Struts-Message.Properties File of Struts2-Core-**. Jar. Simplemente compare el valor clave para sobrescribir el valor correspondiente.
La configuración es la siguiente:
struts.messages.error.uploading = Error de carga: {0}
struts.messages.error.file.too.large = file demasiado grande: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.lowed = content-type no permitido: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.lowed = extensión de archivo no permitido: {0} "{1}" "{2}" {3}
{0}: el valor del atributo de nombre en <input type = "file" name = "uploadImage">
{1}: el nombre real del archivo cargado
{2}: el nombre del archivo de carga guardado en el directorio temporal
{3}: el tipo de archivo cargado (para struts.messages.error.file.too.large es el tamaño del archivo cargado)
Código fuente:
Modificar la información del archivo de recursos que muestra el error
Paso 1: Cree un nuevo archivo de recursos como fileuploadmessage.properties, colóquelo en SRC para agregar la siguiente información al archivo de recursos
struts.messages.error.uploading = Error de carga: {0}
struts.messages.error.file.too.large = flogar archivo es demasiado grande: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.lowed = el tipo de archivo cargado no está permitido: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.howed = el nombre sufijo del archivo cargado no está permitido: {0} "{1}" "{2}" {3}
Paso 2: Cargue el archivo de recursos en el archivo Struts.xml
<!-Configure el archivo de recursos para obtener información sobre errores sobre la carga de archivos->
<constant name = "struts.custom.i18n.resources" value = "cn ... .xxx.fileUploadMessage"/>
2. Cargar varios archivos
Cargue varios archivos, puede usar matrices o listas, y otras son similares a las cargas de archivos únicos.
paquete com.itheima.actions; import java.io.file; import java.io.ioException; import org.apache.commons.io.fileUtils; import org.apache.struts2.servletactionContext; import.opensymphony.xwork2.ActionSupport; // Fallado: Public Class UpLoadActions Extends ActionsUppportt {private SingePeppoppplayame; archivo privado [] foto; // De acuerdo con el nombre del campo de carga del formulario. El tipo es el tipo de archivo.array o la lista de la lista privada [] PhotOfileName; // Cargar el nombre del archivo String privado [] PhotocontentType; // Subiendo el archivo Mime Type public String upload () {// Campo de carga: cargar en una carpeta. Guárdelo en el directorio de imágenes de la aplicación String realPath = servletactionContext.getServletContext (). GetRealPath ("/Images"); Directorio de archivos = nuevo archivo (realPath); if (! Directory.Exists ()) {Directory.MkDirs (); } try {for (int i = 0; i <photo.length; i ++) {fileUtils.CopyFile (Photo [i], nuevo archivo (directorio, PhotoFileName [i])); } return éxito; } catch (ioException e) {E.PrintStackTrace (); Error de retorno; }}}3. Descarga de archivos
Principio: Struts2 proporciona un tipo de resultado de transmisión, que es un tipo de resultado de flujo especificado que se usa específicamente para admitir la función de descarga de archivos. Requiere un parámetro de nombre de entrada para especificar. Este parámetro especifica un flujo de entrada y proporciona la entrada al archivo descargado.
Pasos de codificación:
1) Descargar la clase de acción:
paquete com.itheima.actions; import java.io.file; import java.io.fileInputStream; import java.io.filenotfoundException; import java.io.inputstream; import java.net.urlencoder; import org.apache.commons.io.filenameutils; importar orgache.apache.sencoder; importar org.apache.commons.io.filenameutils; importación de importación com.opensymphony.xwork2.ActionSupport; public class downloadAction extiende ActionSupport {Imagen privado EntryStream; // use en el nombre de archivo de cadena privada con el problema; // nombre de archivo de archivos largos privados; public inputStream getImage () {imagen de retorno; } public void setImage (Imagen InputStream) {this.Image = Image; } public String getFileName () {return FileName; } public Long getFilesize () {return silesize; } public String download () lanza excepción {// Asignar valor a la imagen de byte stream FileRealPath = ServletActionContext.getServletContext (). GetRealPath ("/Web-Inf/classes/如 .jpg"); FileName = FileNameUtils.getName (FileRealPath); // Método 1: El archivo chino debe codificarse URL // FileName = URLENCODER.Encode (nombre de archivo, "UTF-8"); filesize = nuevo archivo (FileRealPath) .length (); System.out.println (nombre de archivo); image = new FileInputStream (FileRealPath); devolver el éxito; }}Archivo de configuración de Struts.xml: Configure principalmente los resultados del tipo de secuencia
<Struts> <constant name = "struts.devmode" value = "true" /> <constant name = "struts.ognl. AlllowStaticMethodaccess" value = "true" /> <Action name = "download" método = "descargar"> <resultado type = "stream"> <param name = "inputName"> image < /param> <!-El nombre de campo de la entrada en la entrada en la acción se necesita y se necesita y se necesita y se prevé que se produzca la acción en la acción y se produzca la acción en la acción y se produzca la acción de acción y se produzca la acción de la acción y se produzca el nombre de acción y se produzca el nombre de la acción y se produzca el nombre de la acción y se proporcione en la acción y se proporcione en la acción y InputStream-> <Param name = "ContentType"> Application/Octet-stream </amamr> <!-Tome el encabezado de respuesta del navegador, el formato MIME del archivo, y llame al método getContentType en acción-> <!-Use la expresión de OGNL en Struts.xml para obtener el valor de la propiedad en la clase de acción. Llame a getFileName () en la clase de acción-> <!-Codificación de nombre de archivo chino: Método 2. Use expresiones OGNL para llamar al método estático de Urlencode-> <!-Las llamadas de OGNL predeterminadas no se pueden hacer métodos estáticos. Debe activar un switch.struts.ognl.OllowstaticMethodaccess = true-> <param name = "ContentDisposition"> adjunto; filename = $ {@java.net.urlencoder@encode (filename, 'utf-8')} </sam> <!-thele the browserwing to towor to to of to of to of tood-> <am name = "Content LITHY"> ">"> $ {<s <rily ">"> $ {/</</</</</<//</</</</<siling ". </resultado> </action> </paquete> </truts> El interceptor y la carga de archivos terminan aquí. Es muy agotador, pero lleno de logros.
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.