之前利用Servlet3.0提供的API实现了简单的文件上传,链接: Servlet 3.0改进的API 实现文件上传
这里使用Struts2来实现文件上传。
首先要在项目中导入Struts2的相关jar包,及common-fileupload.jar和common-io.jar,因为struts2默认上传解析器使用的是jakarta;
实现上传功能
1、首先创建jsp页面 、编写提交表单
<form action="upload.action" method="post" enctype="multipart/form-data">
<input type="file" name="upload"><br>
<input type="submit" value="submit">
</form>
2、创建Action实现上传功能
public class UploadAction extends ActionSupport {
//文件上传域指定的文件,属性名upload必须与文件上传域的name属性相同
private File upload;
//上传文件的原始文件名:由Struts2自动赋值, name+FileName
private String uploadFileName;
//上传文件的MIME类型:由Struts2自动赋值, name+ContentType
private String uploadContentType;
public String execute()throws IOException
{
//获取ServletContext
ServletContext servletCtx = ServletActionContext.getServletContext();
//获取文件输入流
InputStream in = new FileInputStream(upload);
//根据项目的文件存放路径,获取操作系统上的真实路径
String path = servletCtx.getRealPath("/WEB-INF/upload");
//获取输出流(输出位置:path+File.separator+uploadFileName),可指定绝对路径(需要手动创建文件夹)
OutputStream out = new FileOutputStream("F:\\uploads"+File.separator+uploadFileName);
//设立字节数组作为缓冲区(大小为1K)
byte[] buffer = new byte[1024];
//每次读入的字节数
int len =0;
while((len=in.read(buffer))>0)
{
//将字节数组中的字节送入输出流,写到硬盘
out.write(buffer, 0, len);
}
in.close();
out.close();
return SUCCESS;
}
//-----省略getter、setter
Action中的属性与请求参数的name属性相同时,Struts2会自动赋值。所以Action的upload成员变量(private File upload;)与表单文件域的name属性同名。
3、struts.xml中配置拦截器对文件上传进行过滤
<struts>
<!--struts2对整个项目的文件上传大小的控制 ,默认为2M,此处设置为10M(1024*1024*10)-->
<constant name="struts.multipart.maxSize" value="10485760"/>
<package name="upload" extends="struts-default">
<action name="upload" class="com.xxx.action.UploadAction">
<!-- 引用struts2提供的拦截器,对上传文件过滤 -->
<interceptor-ref name="fileUpload">
<!-- fileUpload拦截器对上传文件大小的限制,该值必须小于struts.multipart.maxSize -->
<param name="maximumSize">10485759</param>
<!-- 限制上传文件类型(MIME)-->
<param name="allowedTypes">image/jpeg,image/gif</param>
</interceptor-ref>
<!-- 引用fileUpload拦截器后,必须手动引用 defaultStack拦截器栈,因为此时该action不再自动引用-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">success.jsp</result>
<!-- 文件上传失败时,自动跳转的视图
<result name="input">fail.jsp</result>
</action>
</package>
</struts>
1)、Struts2 对文件上传大小的限制:
- struts.multipart.maxSize掌控整个项目所上传文件的最大的Size,默认2M。超过了这个size,后台报错,程序处理不了如此大的文件
- fileUpload拦截器的maximumSize属性必须小于struts.multipart.maxSize的值。
2)、struts.xml 还可以配置以下常量
<!-- 系统常量定义,定义上传文件字符集编码 -->
<constant name="struts.i18n.encoding" value="utf-8"></constant>
<!-- 系统常量定义,定义上传文件临时存放路径 -->
<constant name="struts.multipart.saveDir" value="F:\"></constant>
多文件上传
多文件的上传与单个文件的上传没有太大的不同。只需做简单的修改即可:
1、修改表单,提供多个文件上传域
<s:form action="upload" method="post" enctype="multipart/form-data">
<tr>
<td>上传文件1:<s:file name="file"></s:file></td>
</tr>
<tr>
<td>上传文件2:<s:file name="file"></s:file></td>
</tr>
<tr>
<td align="left"><s:submit name="submit" value="提交"></s:submit></td>
</tr>
</s:form>
多个文件上传域的name属性必须相同,并且与Action的成员变量(private List< File> file;)同名
2、修改Action ,使之能够获取上传的所有文件
public class UploadAction extends ActionSupport {
//上传文件存放路径
private final static String UPLOADDIR = "/upload";
//上传文件集合
private List<File> file;
//上传文件名集合
private List<String> fileFileName;
//上传文件内容类型集合
private List<String> fileContentType;
public String execute() throws Exception {
int size = file.size();
for (int i = 0; i < size ; i++) {
//循环上传每个文件
uploadFile(i);
}
return "success";
}
//执行上传功能
private void uploadFile(int i) throws FileNotFoundException, IOException {
try {
InputStream in = new FileInputStream(file.get(i));
String dir = ServletActionContext.getRequest().getRealPath(UPLOADDIR);
File uploadFile = new File(dir, this.getFileFileName().get(i));
OutputStream out = new FileOutputStream(uploadFile);
byte[] buffer = new byte[1024];
int length=0;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
in.close();
out.close();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
参考链接:
http://www.oschina.net/code/snippet_105133_2208
http://blog.csdn.net/chow__zh/article/details/9288793
http://blog.csdn.net/xiazdong/article/details/7231977