基于表单上传:
注意点:
- 表单的enctype必须是"multipart/form-data";
- 表单必须使用post方式提交。
- 在webContent下创建一个存放文件的文件夹
Struts.xml配置
<package name="uploaddemo" namespace="/" extends="struts-default"> <action name="load" class="action.UploadAction" method="upload"> <result name="success">index.jsp</result> </action> </package> |
jsp上传页面
<form action="load.action" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传"> </form> |
Action
public class UploadAction extends ActionSupport { //表单name private String file; //文件名 private String fileFileName; //文件类型 private String fileContentType;
//上传方法 public String upload() throws Exception { HttpServletRequest request=ServletActionContext.getRequest(); //获取上传目录 String path=request. //输入流读取文件 InputStream is=new FileInputStream(file); //开始上传文件 OutputStream os=new FileOutputStream(new File(path,fileFileName)); byte[] buffer=new byte[1024]; int len=0; while((len=is.read(buffer))!=-1) { os.write(buffer, 0, len); } os.close(); is.close(); return "success"; } |
注意:上面的文件名和文件类型属性必须为fileFileName,fileContentType,原因是上传的拦截器org.apache.struts2.interceptor.FileUploadInterceptor.class里面有一段代码规定了这两个参数的名字
// inputName是表单中input的name String contentTypeName = inputName + "ContentType"; String fileNameName = inputName + "FileName"; |
我在写Action的时候就是文件名写成fileName导致上传文件的时候空指针异常。
测试:上传一个文件
在tomcat部署下的项目查看文件是否已经上传
上传文件的其他设置
参考struts2 core里的配置文件/org/apache/struts2/default.properties
设置临时目录
struts.multipart.saveDir= 在xml中的配置方法: <!-- 设置临时目录 --> <constant name="struts.multipart.saveDir" value="f:\"></constant> |
设置上传文件的最大值(默认2M)
struts.multipart.maxSize=2097152 |
在Xml配置方法 <!-- 设置文件最大值为20m 单位字节,此处必须大于等于maximumSize --> <constant name="struts.multipart.maxSize" value="20971520"/> |
除了default.properties的设置还需要修改拦截器里面文件大小的配置
<action name="load" class="action.UploadAction" method="upload"> <result name="success">index.jsp</result> <interceptor-ref name="fileUpload"> <param name="maximumSize">20971520</param> </interceptor-ref> <!-- 引用单个拦截器后默认拦截器会失效别忘了重写引用 --> <interceptor-ref name="defaultStack"/> </action> |
源码中的属性:
修改好了试试上传大点的文件
多个文件上传
与上面的单个上传几乎一样,只是Action里面的3个对应的参数类型为数组
Action代码
//获取表单中提交的文件的数组 private File[] file; //文件名数组 private String[] fileFileName; //文件类型数组 private String[] fileContentType;
//上传方法 public String execute() throws IOException { //创建request HttpServletRequest request=ServletActionContext.getRequest(); //获取上传路径 String path=request. //上传过程 遍历数组里面的文件,循环一次就一个文件被上传 for(int i=0;i<file.length;i++) { InputStream is=new FileInputStream(file[i]); OutputStream os=new FileOutputStream(new File(path,fileFileName[i])); byte[] buffer=new byte[1024]; int len=0; while((len=is.read(buffer))!=-1) { os.write(buffer, 0, len); } os.close(); is.close(); } return "success"; }
//get set方法 略 |
Jsp页面代码与单个文件的无异,form表单添加多个input就好了 只是input的name要一致