El ejemplo de este artículo describe cómo implementar la función de carga y descarga de archivos en struts2 en java. Compártelo con todos para tu referencia. El análisis específico es el siguiente:
1.Carga de archivos
El primero es el código de la página jsp.
Definir una etiqueta de carga en la página jsp
Copie el código de la siguiente manera:<tr>
<td align="right" bgcolor="#F5F8F9"><b>Adjunto:</b></td>
<td bgcolor="#FFFFFF">
<tipo de entrada="archivo" nombre="cargar" />
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
Luego se omiten los atributos relacionados definidos en BaseAction (también puedes definirlos en tu propia Acción, simplemente cambia el modificador de acceso)
Copie el código de código de la siguiente manera:/**
*Clase base de acción
**/
la clase pública BaseAction extiende ActionSupport {
carga de Lista protegida<Archivo>;
Lista protegida<String> uploadContentType //Tipo de archivo
Lista protegida<Cadena> uploadFileName //Nombre del archivo;
cadena protegida savePath //guardar ruta
}
Luego hay un método de carga en Acción, el código es el siguiente:
Copie el código de código de la siguiente manera:/**
* 8. Subir archivos adjuntos * @param subir
*/
acceso de carga público vacío (lista <archivo> carga) {
intentar {
si (nulo! = subir) {
para (int i = 0; i < subir.tamaño(); i++) {
Ruta de cadena = getSavePath() + ""+ getUploadFileName().get(i);
System.out.println(ruta);
item.setAccessory(getUploadFileName().get(i));
FileOutputStream fos = nuevo FileOutputStream(ruta);
FileInputStream fis = new FileInputStream(getUpload().get(i));
byte[] buffer = nuevo byte[1024];
int longitud = 0;
mientras ((len = fis.read(búfer)) > 0) {
fos.write(búfer, 0, len);
}
fis.cerrar();
fos.cerrar();
}
}
} captura (Excepción e) {
logger.error("Error al cargar el archivo adjunto.", e);
}
}
Entonces el código de copia de mi archivo struts2.xml es el siguiente: <action name="itemRDAction_*" método="{1}">
<param name="savePath">e:cargar</param>
<interceptor-ref nombre="defaultStack">
<param nombre="fileUpload.allowedTypes">
aplicación/flujo de octeto, imagen/pjpeg, imagen/bmp, imagen/jpg, imagen/png, imagen/gif, imagen/jpeg, aplicación/msword, aplicación/vnd.openxmlformats-officedocument.wordprocessingml.document, aplicación/vnd. ms-excel
</param>
<param nombre="fileUpload.maximumSize">8000000</param>
</interceptor-ref>
<resultado nombre="show_item_rd_upd"> /WEB-INF/jsp/page_item/updItem_rd.jsp</resultado>
<resultado nombre="show_item_rd_list"> /WEB-INF/jsp/page_item/listItem_rd.jsp</result>
<resultado nombre="show_item_rd_push"> /WEB-INF/jsp/page_item/pushItem_rd.jsp</result>
</acción>
savePath es la ruta para guardar, fileUpload.allowedTypes se usa para limitar el límite de tamaño de archivo del tipo de archivo cargado fileUpload.maximumSize
2.Descarga de archivos
Primero, copie el código del enlace de descarga en la página de la siguiente manera: <tr>
<td align="right" bgcolor="#F5F8F9"><b>Adjunto:</b></td>
<td bgcolor="#FFFFFF">
<div>${item.accessory}</div>
<c:if test="${!empty item.accesorio}">
<div style="float: left;"><a style="color: black; text-decoration: none;" href="download.action?filename=${item.accessory}">Descargar</a>< /div>
</c:si>
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
El siguiente es el código para DownloadAction:
Copie el código de código de la siguiente manera:/**
* DescargarAcción
*
* @autor zhaoxz
*
*/
@Controller("descargarAcción")
@Scope("prototipo")
la clase pública DownloadAction extiende BaseAction {
/**
*
*/
serialVersionUID largo final estático privado = -4278687717124480968L;
registrador estático privado registrador = Logger.getLogger(DownloadAction.class);
nombre de archivo de cadena privada;
flujo de entrada privado flujo de entrada;
ruta de guardado de cadena privada;
tipo mime de cadena privada;
flujo de entrada público getInputStream() {
intentar {
Ruta de cadena = getSavePath() + "//"+ new String(filename.getBytes("ISO8859-1"), "utf-8");
System.out.println(ruta);
mimeType = ServletActionContext.getServletContext().getMimeType(ruta)+ ";charset=UTF-8";
inputStream = nuevo FileInputStream(ruta);
Agente de cadena = request.getHeader("USUARIO-AGENTE");
System.out.println(agente);
si (nulo! = agente) {
if (-1 != agente.indexOf("Firefox")) {// Firefox
mimeType = mimeType.replace("UTF-8", "ISO8859-1");
} más {// IE7+ Chrome
System.out.println("IE,Chrome");
nombre de archivo = nueva cadena (nombre de archivo.getBytes ("ISO8859-1"), "utf-8");
nombre de archivo = java.net.URLEncoder.encode(nombre de archivo, "UTF-8");
}
}
} captura (Excepción e) {
logger.error("Error al descargar la información del archivo.", e);
}
si (nulo == flujo de entrada) {
System.out.println ("error de obtención de recursos");
}
devolver flujo de entrada;
}
setInputStream público vacío (InputStream inputStream) {
this.inputStream = inputStream;
}
@Anular
La ejecución de cadena pública () lanza una excepción {
devolver ÉXITO;
}
/****************************** prepárate ***************** ******* **********/
cadena pública getSavePath() {
devolver this.savePath;
}
setSavePath vacío público (String savePath) {
this.savePath = savePath;
}
Cadena pública getFilename() {
devolver nombre de archivo;
}
setFilename público vacío (nombre de archivo de cadena) {
this.filename = nombre de archivo;
}
}
Luego está su archivo struts2.xml:
Copie el código de la siguiente manera: <action name="download">
<param nombre="savePath">E:/subir</param>
<tipo de resultado="flujo">
<param nombre="contentType">${mimeType}</param>
<param name="contentDisposition">archivo adjunto;filename="${filename}"</param>
<param nombre="inputName">inputStream</param>
</resultado>
</acción>
Al descargar, preste atención al formato de codificación y no debería haber ningún problema.
Problemas encontrados durante la carga
1. Se produce un error al cargar archivos grandes Solución 1.
Los errores que se producen son los siguientes:
1. 2012-02-24 11:06:31,937 ERROR (org.apache.struts2.dispatcher.Dispatcher:512) - No se pudo encontrar la acción o el resultado
No se ha definido ningún resultado para la acción com.iman.portal.action.QuestionActionImpl y el resultado problemPage - action - file:/E:/myeclipse/workspaces/portal/WebRoot/WEB-INF/classes/struts2/struts-question.xml:51: 55
2. la solicitud fue rechazada porque su tamaño (2973652) excede el máximo configurado (2097152)
Significado chino: La solicitud fue rechazada porque su tamaño (2973652) excede el máximo configurado (2097152),
Teniendo en cuenta la experiencia del usuario, es necesario interceptar dichas excepciones al cargar archivos adjuntos. La solución es la siguiente:
1. Los archivos cargados se almacenan primero en el caché durante el proceso de carga. Por razones de seguridad, agregue una ruta de almacenamiento temporal al archivo struts.properties del proyecto, aunque la ruta física del servidor se ha configurado en el proyecto.
Copie el código de la siguiente manera: struts.multipart.saveDir=/temp
2. Teniendo en cuenta que el tamaño de carga del archivo puede modificarse más adelante, independientemente de si es el predeterminado o no, agregue la siguiente configuración al archivo struts.properties del proyecto:
Copie el código de la siguiente manera: <!-- El tamaño de archivo de carga permitido es 2M -->
<nombre constante="struts.multipart.maxSize" valor="2097152"/>
Tres, configuración de struts.xml
Copie el código de la siguiente manera: <!-- Cómo modificar el problema -->
<nombre de acción="actualizarProblema" método="actualizarProblema">
<interceptor-ref nombre="fileUpload"/>
<interceptor-ref nombre="defaultStack" />
<resultado nombre="input">/page/question/page/problemPage.jsp</result>
</acción>
4. El paso más importante y crítico
El interceptor fileUpload solo determina el tipo y tamaño del archivo después de cargarlo en el servidor. Si no hacemos nada en Acción, la excepción se mostrará frente al usuario, así que pensé en una forma de configurar la información de la excepción como un mensaje de error a nivel de Acción. Es decir, anule el método addActionError.
Copie el código de código de la siguiente manera: @Override
public void addActionError(String anErrorMessage) {
// Aquí primero debemos determinar si se trata de un error que queremos reemplazar antes de procesarlo.
if (anErrorMessage.startsWith("la solicitud fue rechazada debido a su tamaño")) {
Patrón patrón = Pattern.compile("d+");
Emparejador m = patrón.matcher(anErrorMessage);
// Coincidir una vez
m.buscar();
String s1 =m.group();//Tamaño del archivo cargado
// Coincidir de nuevo
m.buscar();
Cadena s2 =m.group();//tamaño limitado
si(!s1.equals("") && !s2.equals("")){
fileUploadErrorMessage="El tamaño del archivo que has subido (" + Long.valueOf(s1)/1024 + "bytes) excede el tamaño permitido (" + Long.valueOf(s2)/1024/1024 + "M)";
getRequest().setAttribute("fileUploadErrorMessage","El archivo es demasiado grande y excede el tamaño permitido ("+Long.valueOf(s2)/1024/1024+"M). ¡La carga falló!");
// Reemplazar la información
super.addActionError(fileUploadErrorMessage);
}
} else {// De lo contrario, manéjelo según el método original
super.addActionError(anErrorMessage);
}
}
Sí, utilice <s:fielderror/> <s:fielderror/> en la página de retorno para obtener el contenido del error en addActionError.
Como no quiero mostrar la causa del error en la página y quiero que aparezca un cuadro emergente, coloco la información en el objeto de solicitud.
Cuando se carga la página, se agrega la siguiente verificación js:
Copie el código de la siguiente manera: // Determine si el archivo se cargó correctamente
var mensaje="${request.fileUploadErrorMessage}";
if(mensaje!=null && ""!=trim(mensaje) && mensaje!="null"){
self.parent.diag.close();
alerta(mensaje);
devolver;
}
Aquí hay algunas referencias para entender Dongdong:
struts.multipart.maxSize controla el tamaño máximo de los archivos cargados por todo el proyecto
Los atributos de tamaño máximo de los interceptores struts.multipart.maxSize y fileUpload tienen diferentes divisiones de trabajo, que se resumen a continuación:
1.struts.multipart.maxSize controla el tamaño máximo de los archivos cargados en todo el proyecto.
Si se excede este tamaño, se informará un error en segundo plano y el programa no podrá manejar un archivo tan grande. Aparecerá el siguiente mensaje en el error de campo:
la solicitud fue rechazada porque su tamaño (16272982) excede el máximo configurado (9000000)
2. El atributo de tamaño máximo del interceptor fileUpload debe ser menor que el valor de struts.multipart.maxSize.
El valor predeterminado de struts.multipart.maxSize es 2M. Cuando el tamaño máximo es mayor que 2M, el valor de struts.multipart.maxSize debe establecerse en un valor mayor que el tamaño máximo.
3. Cuando el archivo cargado es más grande que struts.multipart.maxSize, el sistema informa un error. Cuando el archivo cargado está entre struts.multipart.maxSize y MaximumSize, el sistema solicita:
Archivo demasiado grande: archivo "MSF concept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
Cuando el archivo cargado es más pequeño que el tamaño máximo, la carga se realiza correctamente.
Copie el código de la siguiente manera: <action name="UploadFile">
<resultado nombre="UploadFileResult">/pages/ShowOtherFiles.jsp</result>
<resultado nombre="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref nombre="fileUpload">
<param nombre="savePath">/datos</param>
<param nombre="maximumSize">52428800</param>
</interceptor-ref>
<interceptor-ref nombre="defaultStack"></interceptor-ref>
</acción>
Se produce un error al cargar archivos grandes. Solución 2:
Problema: Error al cargar archivos grandes...
Solución: modifique los parámetros en el archivo struts.xml de la siguiente manera. Copie el código de la siguiente manera: <constant name="struts.multipart.maxSize" value="55000000"/>.
<nombre de acción="Subir archivo">
<resultado nombre="UploadFileResult">/www.VeVB.COm/ ShowOtherFiles.jsp</result>
<resultado nombre="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref nombre="fileUpload">
<param nombre="savePath">/datos</param>
<param nombre="maximumSize">52428800</param>
</interceptor-ref>
<interceptor-ref nombre="defaultStack"></interceptor-ref>
</acción>
La relación entre el tamaño del archivo struts.xml y el tamaño del archivo real: 1048576 (Bytes) = 1024*1024 = 1 M de tamaño de archivo real.
struts.multipart.maxSize controla el tamaño máximo de los archivos cargados por todo el proyecto
Los atributos de tamaño máximo de los interceptores struts.multipart.maxSize y fileUpload tienen diferentes divisiones de trabajo, que se resumen a continuación:
1.struts.multipart.maxSize controla el tamaño máximo de los archivos cargados en todo el proyecto. Si se excede este tamaño, se informará un error en segundo plano y el programa no podrá manejar un archivo tan grande. Aparecerá el siguiente mensaje en el error de campo:
la solicitud fue rechazada porque su tamaño (16272982) excede el máximo configurado (9000000)
2. El atributo de tamaño máximo del interceptor fileUpload debe ser menor que el valor de struts.multipart.maxSize.
El valor predeterminado de struts.multipart.maxSize es 2M. Cuando el tamaño máximo es mayor que 2M, el valor de struts.multipart.maxSize debe establecerse en un valor mayor que el tamaño máximo.
3. Cuando el archivo cargado es más grande que struts.multipart.maxSize, el sistema informa un error. Cuando el archivo cargado está entre struts.multipart.maxSize y MaximumSize, el sistema solicita:
Archivo demasiado grande: archivo "MSF concept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
Cuando el archivo cargado es más pequeño que el tamaño máximo, la carga se realiza correctamente.
Cargar restricciones de tipo de archivo
Configurar el interceptor de carga de archivos
La pila predeterminada de struts2 ya contiene el interceptor de carga de archivos. Si desea agregar el parámetro AllowTypes, debe escribir una nueva pila predeterminada, copiarla y modificarla:
Copie el código de la siguiente manera: <interceptores>
<nombre-pila-interceptor="myDefaultStack">
<interceptor-ref nombre="excepción"/>
<interceptor-ref nombre="alias"/>
<interceptor-ref nombre="servletConfig"/>
<interceptor-ref nombre="i18n"/>
<nombre-ref-interceptor=www.VeVB.COm/>
<interceptor-ref nombre="cadena"/>
<interceptor-ref nombre="depuración"/>
<interceptor-ref nombre="perfilado"/>
<interceptor-ref nombre="scopedModelDriven"/>
<interceptor-ref nombre="modelDriven"/>
<interceptor-ref nombre="fileUpload">
<param nombre="tipos permitidos">
imagen/png,imagen/gif,imagen/jpeg
</param>
</interceptor-ref>
<interceptor-ref nombre="casilla de verificación"/>
<interceptor-ref nombre="staticParams"/>
<interceptor-ref nombre="actionMappingParams"/>
<interceptor-ref nombre="params">
<param name="excludeParams">dojo..*,^struts..*</param>
</interceptor-ref>
<interceptor-ref nombre="conversionError"/>
<interceptor-ref nombre="validación">
<param name="excludeMethods">entrada,atrás,cancelar,examinar</param>
</interceptor-ref>
<interceptor-ref nombre="flujo de trabajo">
<param name="excludeMethods">entrada,atrás,cancelar,examinar</param>
</interceptor-ref>
</interceptor-pila>
</interceptores>
<default-interceptor-ref nombre="myDefaultStack"></default-interceptor-ref>
Modifique solo el código copiado en el código de la siguiente manera: <interceptor-ref name="fileUpload">
<param nombre="tipos permitidos">
imagen/png,imagen/gif,imagen/jpeg
</param>
</interceptor-ref>
La pila de interceptores se configura dentro de la etiqueta <package> y fuera de la etiqueta <action> como se indicó anteriormente. Si lo definimos como el interceptor predeterminado, no es necesario.
Introdúcelo en la etiqueta <action>. Si no, debes introducir un interceptor. Copia el código: <action>.
<resultado nombre="entrada">/error/dbError.jsp</resultado>
<interceptor-ref nombre="myDefaultStack"></interceptor-ref>
</acción>
La acción de error del tipo de carga de archivos devolverá directamente la entrada, por lo que no es necesario devolver "entrada" en la acción;
También puedes definir la ruta y el tamaño de tu solicitud de carga fuera de la etiqueta <paquete>:
Copie el código de la siguiente manera: <constant name="struts.multipart.saveDir" value="/upload/detailed"></constant>
<constante nombre="struts.multipart.maxSize" valor="1024"></constante>
El punto más importante: el formulario para cargar archivos debe agregar: enctype="multipart/form-data". De lo contrario, se informará un error de entrada.
Espero que este artículo sea útil para la programación Java de todos.