struts2提供了对上传文件的支持,将上传后的文件封装为java.io.File对象,开发者只需要在Action中定义一个File类型的变量,然后直接使用该变量,将它复制到目的目录即可.
-
单个文件上传实例
` 下面是一个单个文件上传的小例子,webRoot下新建一个upLoad.jsp,核心代码为:
<body>
<!-- 必须将method指定为post,同时将enctype属性设置成如下形式,
第一个input中的name属性,值必须与Action中定义的Fil类型的变量名相同 -->
<form action="upLoad.action" method="post" enctype="multipart/form-data">
文件:<input type="file" name="picture"/><br>
<input type="submit" value="上传"/>
</form>
</body>
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:
<struts>
<!-- 设置临时目录 -->
<constant name="struts.multipart.saveDir" value="F:\"/>
<!--设置上传文件的最大存储,其value必须大于 下面的maximumSize,因为检查文件大小时,会先检查Struts2全局的MaxSize属性,后检查maximumSize属性 -->
<constant name="struts.multipart.maxSize" value="20971520"></constant>
<package name="default" namespace="/" extends="struts-default">
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="fileUpload">
<param name="allowedTypes"></param>
<param name="maximumSize">20971520</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="upLoad" class="com.wang.action.UpLoadAction" method="upLoad">
<result>/index.jsp</result>
<interceptor-ref name="myStack"></interceptor-ref>
</action>
</package>
</struts>
-
批量文件上传
与上传单个文件类似,只需要将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 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
8 <html>
9 <head>
10 <base href="<%=basePath%>">
11
12 <title>My JSP 'upLoad.jsp' starting page</title>
13
14 <meta http-equiv="pragma" content="no-cache">
15 <meta http-equiv="cache-control" content="no-cache">
16 <meta http-equiv="expires" content="0">
17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18 <meta http-equiv="description" content="This is my page">
19 <!--
20 <link rel="stylesheet" type="text/css" href="styles.css">
21 -->
22 <script type="text/javascript" src="jquery/jquery.min.js"></script>
23 <script type="text/javascript">
24 $(function(){
25 $('#btn').click(function(){
26 var field="<p>文件:<input type='file' name='picture'/><input id='btn' type='button' value='删除' onclick='deleteCurrent(this);'/><br></p>"
27 $("#files").append(field);
28 });
29
30 });
31 function deleteCurrent(a){
32 $(a).parent().remove();
33 }
34 </script>
35 </head>
36
37 <body>
38 <!-- 必须将method指定为post,同时将enctype属性设置成如下形式,
39 第一个input中的name属性,值必须与Action中定义的Fil类型的变量名相同 -->
40 <form action="upLoad.action" method="post" enctype="multipart/form-data">
41 文件:<input type="file" name="picture"/><input id="btn" type="button" value="添加"/><br>
42 <div id="files"></div>
43 <input type="submit" value="上传"/>
44 </form>
45 </body>
46 </html>
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<picture.length;i++){
File saved=new File(path,pictureFileName[i]);
InputStream is=new FileInputStream(picture[i]);
OutputStream os=new FileOutputStream(saved);
byte[] b=new byte[1024];
int len=0;
while((len=is.read(b))!=-1){
os.write(b, 0, len);
}
is.close();
os.close();
}
System.out.println("upLoad success");
return SUCCESS;
}
public File[] getPicture() {
return picture;
}
public void setPicture(File[] picture) {
this.picture = picture;
}
public String[] getPictureFileName() {
return pictureFileName;
}
public void setPictureFileName(String[] pictureFileName) {
this.pictureFileName = pictureFileName;
}
public String[] getPictureContentType() {
return pictureContentType;
}
public void setPictureContentType(String[] pictureContentType) {
this.pictureContentType = pictureContentType;
}
}
struts.xml不需要修改.