现在的位置: 首页 > 综合 > 正文

基于Struts2上传文件实例解析

2013年08月26日 ⁄ 综合 ⁄ 共 2726字 ⁄ 字号 评论关闭
文章目录

    文件上传几乎成了我们每个系统的必备功能,那么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;
	}


	@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.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中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。

【上篇】
【下篇】

抱歉!评论已关闭.