struts2提供了对上传文件的支持,将上传后的文件封装为java.io.File对象,开发者只需要在Action中定义一个File类型的变量,然后直接使用该变量,将它复制到目的目录即可.
-
单个文件上传实例
` 下面是一个单个文件上传的小例子,webRoot下新建一个upLoad.jsp,核心代码为:
action包下新建一个名为UpLoadAction的java类:
1 package com.wang.action; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.OutputStream;10 11 import javax.servlet.http.HttpServletRequest;12 13 import org.apache.struts2.ServletActionContext;14 15 import com.opensymphony.xwork2.ActionSupport;16 17 public class UpLoadAction extends ActionSupport{18 19 //上传的文件,struts2会把文件封装为File对象20 private File picture;21 //文件名,struts2会把文件名称设置到该变量22 private String pictureFileName;23 //文件类型,struts2会把文件类型设置到该变量24 private String pictureContentType;25 26 public String upLoad() throws IOException{27 //获取request,进而获取文件的路径28 HttpServletRequest request=ServletActionContext.getRequest();29 String path=request.getRealPath("/aaa");30 //最终将文件保存到/upload下31 File saved=new File(path,pictureFileName);32 InputStream is=new FileInputStream(picture);33 OutputStream os=new FileOutputStream(saved);34 byte[] b=new byte[1024];35 int len=0;36 while((len=is.read(b))!=-1){37 os.write(b, 0, len);38 }39 40 is.close();41 os.close();42 System.out.println("upLoad");43 return SUCCESS;44 45 }46 47 public File getPicture() {48 return picture;49 }50 public void setPicture(File picture) {51 this.picture = picture;52 }53 public String getPictureFileName() {54 return pictureFileName;55 }56 public void setPictureFileName(String pictureFileName) {57 this.pictureFileName = pictureFileName;58 }59 public String getPictureContentType() {60 return pictureContentType;61 }62 public void setPictureContentType(String pictureContentType) {63 this.pictureContentType = pictureContentType;64 }65 66 }
特别注意上面代码第29行,要在webRoot路径下新建一个名为aaa的文件夹,,用于存放上传的文件.
UpLoadAction中定义了一个名为picture的File类型的对象,用于接收表单传来的图片文件,Struts2会把图片文件保存到临时文件夹里,然后把路径设置到picture属性上,需要注意的是,临时文件的名称不会是上传文件的原名称,目的是为了保证临时文件夹中文件名不会重复,Struts2根据时间戳随机生成了不重复的文件名,后缀是.tmp.但我们一般希望获取该文件的原始名称,这时,我们还需要定义一个String类型的名为xxxFileName的属性,其中xxx在这个例子里是picture,即为File类型的变量名,同时要想获得原始文件的文件类型,还需要定义一个String类型的名为xxxContentType的变量,xxx也是File类型的变量名.
Struts2中文件上传的最大值为2m,但我们希望可以自定义最大上传Size,下面是修改了MaxSize(将最大上传大小设置为20m)的Struts.xml:
20971520 /index.jsp
-
批量文件上传
与上传单个文件类似,只需要将UpLoadAction里File,xxxFileName,xxxContentType设置为数组类型,然后用for循环遍历读取每个文件,即可,这里主要介绍一下上传多个文件的简单的前端页面怎么写(用到jquery):我们希望的效果是这样(点击添加可以添加一个file选项,点击删除可以删除当前file选项):
upLoad.jsp代码如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 8 9 1045 4611 12 My JSP 'upLoad.jsp' starting page 13 14 15 16 17 18 19 22 23 35 36 37 38 40
upLoadAction代码如下:
package com.wang.action;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class UpLoadAction extends ActionSupport{ //上传的文件,struts2会把文件封装为File对象 private File[] picture; //文件名,struts2会把文件名称设置到该变量 private String[] pictureFileName; //文件类型,struts2会把文件类型设置到该变量 private String[] pictureContentType; public String upLoad() throws IOException{ //获取request,进而获取文件的路径 HttpServletRequest request=ServletActionContext.getRequest(); String path=request.getRealPath("/aaa"); //最终将文件保存到/upload下 for(int i=0;i
struts.xml不需要修改.