基于Struts2上传文件实例解析

来源:互联网 发布:jquery格式化json日期 编辑:程序博客网 时间:2024/05/29 11:00

    文件上传几乎成了我们每个系统的必备功能,那么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、执行actionexecute方法,完成上传。

            4FileUploadInterceptor负责删除临时文件(可能是错误的或者需要其他配置)。调用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;}@Overridepublic 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.jsperror.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中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。