文件上传几乎成了我们每个系统的必备功能,那么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中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。