利用Struts2实现文件上传的方式主要分为两种,一种是使用最基础的FileInputStream读取到内存,然后利用FileOutputStream来实现文件的写入硬盘;另外一种是使用Apache的commons-io这个jar包封装好的方法,其中FileUtils类的copyFile(srcFile,destFile)方法将struts2默认的临时目录中的文件复制到实际的上传目录中。
构建项目的方式就和构架构建普通的Struts2的项目一致,首先加入jar包,然后配置web.xml文件,然后编写struts.xml
(可以从Struts2的Example中将公共部分复制到自己的项目中,将不必要的部分删除,这样既省事儿省力又可以保证正确性)
上传页面代码:
<form action="uploadfile" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username" id="username"/><br/>
文 名:<input type="file" id="filename" name="upload"/><br/>
<input type="submit" value="提交"/>
<div>${message}</div>
</form><br/>
<form action="uploadfile2" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username" id="username"/><br/>
文 名:<input type="file" id="filename" name="upload"/><br/>
<input type="submit" value="提交"/>
<div>${message}</div>
</form>
Action的上传文件处理代码:
使用FileInputStream和FileOutputStream的最基本的方法:
private File upload; //上传的文件,与页面的<input type="file" name="upload"/>中的name属性一致
private String uploadFileName;//文件名,Struts规定个格式 [name]FileName
private String uploadContentType;//文件类型,Struts规定的格式[name]ContentType
private String username;
//private String parentDir;
@SuppressWarnings("deprecation")
public String execute() {
try {
InputStream is = new FileInputStream(upload);//创建输入流,读取上传文件
//String parentDir = ServletActionContext.getServletContext().getRealPath(parentDir);
String parentDir = ServletActionContext.getRequest().getRealPath(
"/upload");//指定文件上传目录
File destFile = new File(parentDir, this.getUploadFileName());
if (!destFile.getParentFile().exists()) {//判断存放文件的目录是否存在
destFile.getParentFile().mkdir();//不存在则创建
}
OutputStream os = new FileOutputStream(destFile);//创建输出流,将内容写入文件
byte[] buffer = new byte[1024];
int length = 0;
while ((length = is.read(buffer)) > 0) {// 读文件
os.write(buffer, 0, length);// 写文件
}
is.close();//关闭inputStream
os.close();//关闭outputStream
} catch (Exception e) {
e.printStackTrace();
}
return "success";
}
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
上传文件的路径也可以在Struts.xml文件中Action的param属性进行指定,然后通过
ServletActionContext.getServletContext().getRealPath(paramName)
获取到相应的参数值即可;
使用Commons-io这个jar包提供的方法:
/**
...与之前的方法一致的部分(各个字段的setters和getters)
*/
public String execute(){
String parentDir = ServletActionContext.getRequest().getRealPath("/upload");
File destFile = new File(parentDir,this.getUploadFileName());
if(!destFile.getParentFile().exists()){
destFile.getParentFile().mkdir();
}
try {
FileUtils.copyFile(upload, destFile);//将文件从临时文件目录复制到目标目录
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
配置文件Struts.xml
<!-- 配置文件上传临时目录 -->
<!-- <constant name="struts.multipart.saveDir " value="e:/tmpupload" /> -->
<package name="uploadfile" extends="struts-default">
<action name="uploadfile" class="changluo.file.UploadFileAction">
<!-- 配置上传路径 -->
<!-- <param name="parentDir">/upload</param> -->
<result name="success">/uploadResult.jsp</result>
<result name="input">/index.jsp</result>
<!-- 配置拦截器,可以惊醒一些特殊的需求 -->
<!--
<interceptor-ref name="fileupload">
<param name="maximumsize">409600</param>
<param name="allowedTypes">
application/vnd.ms-powerpoint
</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref> -->
</action>
<action name="uploadfile2" class="changluo.file.UploadFileAction2">
<result name="success">/uploadResult.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
如果需要满足特殊的上传需求,可以配置拦截器,在拦截器里配置允许的上传文件类型以及上传文件的大小
<param name="maximumsize">409600</param>
<param name="allowedTypes">
application/vnd.ms-powerpoint
</param>
翻看Struts2的org.apache.struts2.interceptor.FileUploadInterceptor类的源代码就可以看到这俩属性的定义:
Protected long maximumSize;
Protected String allowedTypes
***具体的文件上传类型可以参考tomcat目录下的conf\web.xml文件中的一系列文件类型。
关于Struts2上传文件的临时目录,翻看Struts2中的Struts.properties文件就可以看到这么两句
#uses java.servlet.context.tempdir by default
struts.multipart.saveDir=
如果Struts2上传文件的临时目录在Struts.xml中没有设置设置
<constant name="struts.multipart.saveDir " value="e:/tmpupload" />
则可以在控制台看到如下提示信息:
信息: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir
另外,还可以通过设置struts.i18n.encoding的属性进行修改编码设置!
其实这两种方式的实现机理都是一致的,都是通过第一种这种最基础的方式实现的,翻看Commons-io这个jar包中的FileUtils类的源代码就可以轻易的发现!
得找机会看看关于Commons-fileupload实现文件上传的相关资料!!个人感觉apache的很多开源项目都很不错~~~~可惜自己还没有怎么熟悉啊~~~
分享到:
相关推荐
NULL 博文链接:https://hbiao68.iteye.com/blog/1452476
这个是本人自学struts2框架时的总结笔记,里面关于struts2的基本知识很是详尽,如果想要进阶的就不要看了,这只是struts2基础的笔记,个人学习用的,绝不掺假!
自学传智博客struts2-黎活明-源码-第01讲_01介绍struts2及struts2开发环境的搭建_DemoStruts2.rar; 笔记地址:http://www.guloulou.com/?p=1253
本文档记录了Struts2初学中的所有要点笔记,非常详尽的知识点说明并附加了学习者对知识的理解过程,是新人学习Struts2框架的必备参考典范。
Struts1新手入门笔记Struts1新手入门笔记
struts2笔记。 适合初学者参考使用。罗列了一些struts2的重点内容,适合自学
struts各个知识点汇总,重点把握struts要害,快速掌握并着手应用。详细,简明
自学struts2做的笔记,自己感觉用起来挺方便的,内容也全面。查询起来也方便。基本涵盖struts2常用资源。
自学传智博客struts2-黎活明-源码-第02讲_02第一个struts2应用开发_DemoStruts2.rar 笔记地址:http://www.guloulou.com/?p=1252
Struts 国际化 类型转换 Jfreechart 等学习笔记 自学笔记 仅供参考
经典的struts自学宝典,都是我的潜心专研,精心总结出来的
非常好的一个自学文档,精辟,囊括所有重点。
Struts2的教程笔记.简单的入手,适合初学者,自学者.
希望对大家有所帮助,j2ee的一些心得体会
看的东西不在多,而在于精, 程序设计最重要的就是上级操作了, 既然选择了,就该要有坚持的觉悟... Cookie使用. ...里面是当年自学JAVA时的一些笔记,内容都是TXT格式的,都是一些基础性的概念总结。
框架开发关于hibernate和struts的个人笔记
本Jva(Java)学习笔记是一份深入且详尽的教程,不仅包括Java的基础知识,还融入了作者的个人见解和实际编程经验。内容涵盖: Java基础:数据类型、控制流、异常处理。 面向对象编程:类与对象、继承、多态、封装。...
JAVA配置文件编写说明文档.pdf jboss.pdf log4j使用教程.txt struts_action.txt struts标签.chm swing02.doc Tomcat.chm webAndXml.pdf 正则表达式.chm 网页常用的jsp 脚本.doc JSF入门简体中文版 struts标签中文 ...