一、文件上传
1、上传文件jsp页面
表单中enctype 必须为 multipart/form-data,提交方式必须为 post。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> ?<head> ???<title>My JSP ‘fileupload.jsp‘ starting page</title> ????<meta http-equiv="pragma" content="no-cache"> ???<meta http-equiv="cache-control" content="no-cache"> ???<meta http-equiv="expires" content="0"> ?????</head> ???<body> ???<form action="fileupload_fileUpload.action" enctype="multipart/form-data" method="post"> ???????<s:if test="fieldErrors[‘upload‘].size()>0"> ???????????<s:property value="fieldErrors[‘upload‘][0]"/> ???????</s:if> ???????<!-- 说明上传成功 --> ???????<s:else> ???????????<p> ???????????????<s:property value="message"/> <!-- 显示上传成功的提示信息 --> ???????????????文件名:<s:property value="uploadFileName"/> <!-- 显示上传文件名 --> ???????????????文件类型:<s:property value="uploadContentType"/> <!-- 显示上传文件类型 --> ???????????</p> ???????</s:else> ???????<p> ???????????上传者:<input type="text" name="author" class="ipt"> ???????</p> ???????????<p> ???????????选择文件:<input type="file" name="upload" class="ipt"> ???????</p> ???????<p><input type="submit" value="提交"> </p> ???????????</form> ?</body></html>
2、上传文件Action
对于name属性为xxx的文件,Action中需要用File类型的xxx封装上传的文件实例,用String类型的xxxFileName封装文件的名称,用xxxContent封装文件的文件类型。
package com.action;import java.io.File;import org.apache.commons.io.FileUtils;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;public class FileUploadAction extends ActionSupport { ???/** ????* ?????*/ ???private static final long serialVersionUID = 1L; ???private String message; // 提示信息 ???private String author; // 上传者 ???//需要提供get set方法才会封装进值 ???private File upload; // Struts2会将上传成功的文件对象赋值给该属性 ???private String uploadFileName; // 封装上传文件的名称,包括后缀 ???private String uploadContentType; // 封装上传文件的类型 ???????public String fileUpload() throws Exception { ???????// 保存文件的路径 ???????String realpath = ServletActionContext.getServletContext().getRealPath("/upload"); ???????System.out.println("文件路径" + realpath+"\n"+"文件类型:"+uploadContentType); ???????// 未选择上传文件就提交的处理 ???????if (upload != null) { ???????????File savefile = new File(new File(realpath), uploadFileName); ???????????// 如果该文件所在目录不存在,则生成一个目录 ???????????if (!savefile.getParentFile().exists()) { ???????????????savefile.getParentFile().mkdirs(); ???????????} ???????????FileUtils.copyFile(upload, savefile); ???????????????????????ActionContext.getContext().put("msg", "上传文件成功"); ???????}else{ ???????????ActionContext.getContext().put("msg", "请选择上传文件"); ???????} ???????return "success"; ???} ???????public String getMessage() { ???????return message; ???} ???public void setMessage(String message) { ???????this.message = message; ???} ???public String getAuthor() { ???????return author; ???} ???public void setAuthor(String author) { ???????this.author = author; ???} ???public File getUpload() { ???????return upload; ???} ???public void setUpload(File upload) { ???????this.upload = upload; ???} ???public String getUploadFileName() { ???????return uploadFileName; ???} ???public void setUploadFileName(String uploadFileName) { ???????this.uploadFileName = uploadFileName; ???} ???public static long getSerialversionuid() { ???????return serialVersionUID; ???} ???public String getUploadContentType() { ???????return uploadContentType; ???} ???public void setUploadContentType(String uploadContentType) { ???????this.uploadContentType = uploadContentType; ???}}
3、struts.xml配置
如果不配置上传的文件大小,当所选文件过大时,会报错。
Struts2提供了一个文件上传的拦截器,配置拦截器时,可以为其指定两个参数:allowedTypes 和 maximumSize。
注意:其中常量里配置的文件上传大小是总的上传文件大小,拦截器中是单个上传文件大小。常量配置的允许大小,可视为总开关,不满足条件的大小将不会触发拦截且会报错。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "struts-2.3.dtd" ><struts> ???<!-- 热部署 --> ???<constant name="struts.configuration.xml.reload" value="true"></constant> ???<!-- 修改struts2允许上传的最大值 --> ???<constant name="struts.multipart.maxSize" value="7097152"/> ???<!-- 动态方法调用 --> ???<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> ???<package name="hello" namespace="/" extends="struts-default"> ???????<action name="fileupload_*" class="com.action.FileUploadAction" method="{1}"> ???????????<!-- 引入文件上传过滤器 --> ???????????<interceptor-ref name="fileUpload"> ??????????????<param name="maximumSize">7097152</param> <!-- 允许上传的单个文件大小 --> ??????????????<param name="allowedTypes">image/bmp</param> <!-- 允许上传的文件类型,多个用,隔开 --> ????????????????????????????</interceptor-ref> ????????????<!-- 配置系统默认拦截器 --> ????????????<interceptor-ref name="defaultStack"/> ??????????????<result name="input">/fileupload.jsp</result> ?<!-- 文件过滤失败后,转入input视图 --> ????????????????????????<result name="success">/fileupload.jsp</result> ???????</action> ???????????</package></struts> ??
常见问题:
当我们上传文件出错时,会出现Struts2系统默认的提示信息,这些信息,可以根据<s:debug>标签获取,为了获取更国际化的提示信息,例如,将提示信息改为中文。
操作步骤:
1、在struts.xml配置中加载全局国际化资源文件的常量
<constant name="struts.custom.i18n.resources" value="message"/>
2、在src目录下创建message.properties全国国际化文件,文件中添加如下内容
struts.messages.error.file.too.large=\u60A8\u8981\u4E0A\u4F20\u7684\u6587\u4EF6\u592A\u5927\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9
Struts2同时上传多个文件
Action类:
public class ManyFileUploadAction extends ?ActionSupport{ ????private ?List<File> ?upload; ?//多文件封装为List ????private ?List<String> uploadFileName; ?????????????????public ?String ?manyFileUpload() throws Exception{ ?????????for(int i=0;i<upload.size();i++){ ?????????????//处理每个文件上传的业务操作 ????}}
Struts2之文件上传下载
原文地址:https://www.cnblogs.com/x-jingxin/p/8461242.html