文件上传几乎成了我们每个系统的必备功能,那么struts2这个框架是如何帮助我们简单快速实现文件上传的呢?下面我将一个简单的实例来说明基于Struts2的文件上传。
Struts2文件上传原理:
首先简单说一下Struts2上传文件的原理:
1、利用FileUpload工具包,将用户上传的文件写入到临时文件中。
2、在struts-default.xml进行配置FileUploadInterceptor拦截器,在用户发送请求来的时候,拦截这个请求,读取文件,写入临时文件,并且调用目标Action的 set*(File myFile),这个myFile就是临时文件、set×FileName(String fileName)(真实的文件名)、set×ContentType(String contentType)(真实的文件后缀名)方法。
3、执行action的execute方法,完成上传。
4、FileUploadInterceptor负责删除临时文件(可能是错误的或者需要其他配置)。调用delete方法删除临时文件。
实例
下面是一个简单的小例子:
项目整体图
首先看一下项目的整体图:
JSP页面:
按照访问流程,首先是jsp页面:upload.jsp、success.jsp。
<body>
<form action="upload/uploadAction" method="post" enctype="multipart/form-data">
<input type="file" name="upload">
<input type="submit" value="登陆">
</form>
</body>
注意:众所周知,上传要用post提交方式;enctype也要修改(见下文关于enctype的解释)。
Action
jsp页面有了,下面就是jsp页面要请求的action了。
public class UploadAction extends ActionSupport {
//要上传的文件,这里是临时文件
private File upload;
//文件名,真实的文件名字,不是临时文件的哦。
private String uploadFileName;
//文件的类型,真实的。
private String uploadContentType;
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;
}
@Override
public String execute() throws Exception {
//获取文件要上传到的目录的真是路径,即upload文件夹在服务器上的真实路径。
File uploadFile = new File(ServletActionContext.getServletContext().getRealPath("upload"));
//定义输入输出流
FileInputStream input = new FileInputStream(upload);
FileOutputStream out= new FileOutputStream(uploadFile+"\\"+uploadFileName);
try {
//定义每次提交的量,即没1024B进行一次提交
byte[] b = new byte[1024];
//记录提交位置
int i =0;
while((i=input.read(b))>0)
{
out.write(b, 0, i);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
input.close();
out.close(); upload.delete();//删除临时文件
}
return "success";//如果成功,返回成功页面
}
}
上传文件存放目录
建立一个上传文件的存放目录是必不可少的:upload文件夹(见截图)
Struts配置文件
要想请求到达这个action,还必须要在struts.xml配置文件中进行配置。
<struts>
<package name="uploadManager" namespace="/upload" extends="struts-default">
<action name="uploadAction" class="com.action.UploadAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
Success.jsp和error.jsp非常简单了,这里就不给出了。
到这里,我们就实现了struts2的上传,上传的文件会存放在我们建立的upload文件夹中。
附Enctype解释
附:关于enctype的解释:
enctype属性指定的是表单数据的编码方式,该属性有3个值:
1)application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
2)multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
3) text/plain:这种方式主要适用于直接通过表单发送邮件的方式。
通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数据以二
进制编码的方式提交,在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。