struts2学习笔记--上传单个和批量文件示例
2016-02-16 16:43
661 查看
struts2提供了对上传文件的支持,将上传后的文件封装为java.io.File对象,开发者只需要在Action中定义一个File类型的变量,然后直接使用该变量,将它复制到目的目录即可.
` 下面是一个单个文件上传的小例子,webRoot下新建一个upLoad.jsp,核心代码为:
action包下新建一个名为UpLoadAction的java类:
UpLoadAction代码
特别注意上面代码第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:
与上传单个文件类似,只需要将UpLoadAction里File,xxxFileName,xxxContentType设置为数组类型,然后用for循环遍历读取每个文件,即可,这里主要介绍一下上传多个文件的简单的前端页面怎么写(用到jquery):我们希望的效果是这样(点击添加可以添加一个file选项,点击删除可以删除当前file选项):
upLoad.jsp代码如下:
upLoad.jsp
upLoadAction代码如下:
UpLoadAction
struts.xml不需要修改.
` 下面是一个单个文件上传的小例子,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 }
UpLoadAction代码
特别注意上面代码第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>
upLoad.jsp
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; } }
UpLoadAction
struts.xml不需要修改.
相关文章推荐
- JAXB将JAVA对象转换为XML时CDATA的问题
- eclipse tips
- spring 对象初始化
- java jdk environment variables
- spring 中配置bean的注入是<property>的name与与ref的id名需要一样吗??
- java中key值可以重复的map:IdentityHashMap
- java.net.SocketTimeoutException: failed to connect to /10.0..2.2 (port 8080) after 10000ms
- java 获取本机的公网、外网ip
- struts之拦截器
- java 实现WebService 以及不同的调用方式
- java synchronized详解
- Java-day8反射 设计模式 JDK新特性
- Java的多线程之执行器
- 深入源码-spring事件通知机制详解
- Struts2基本原理
- eclipse 中 *.properties 中 unicode 显示 中文(国际化),需要安装Properties Editor
- CommonsMultipartFile---用Spring实现文件上传
- springMVC +mybatis的配置
- Java-day07多线程
- Java-day06异常及IO流