Struts2学习笔记(六)之控制单个与多个文件的上传

           下一篇中介绍文件的下载(点击链接进入:Struts2实现文件下载功能)

        

       (一) 在开发中避免不了要进行文件的上传工具,使用Struts2框架,我们也可以非常容易的实现文件的上传工作,首先看下在进行写代码之前的最基本的工具准备:

      

       <①>:在进行上传文件的请求叶面中要加入:把表单的method设置成post请求,还要加入enctype=multipart/form-data,这样浏览器才可以把要上传的文件以二进制文件的方式上传到服务器;看下截图:       

       

     

       <②>:我们还需要在web应用的lib目录中加入commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar包,看下截图:

    

      

       (二) 接下来说下文件上传的步骤:

         Struts2在进行文件上传操作时,实际上是通过两个步骤实现的: 
     ①:首先将客户端上传的文件保存到struts.multipart.saveDir键所指定的目录中,如果该键所对应的目录不存在,那么就保存到javax.servlet.context.tempdir 环境变量所指定的目录中。 
     ②:Action中所定义的File类型的成员变量file实际上指向的是临时目录中的临时文件,然后在服务器端通过IO 的方式将临时文件写入到指定的服务器端目录中,然后把临时文件删除掉:

      

      看下控制台打印的信息:             

           

           (三)下面直接使用一个简单例子来实现文件的上传:

      ①:看下文件上传页面的fileupload.jsp的关键代码:

          这个页面上面有一个文件域,并且把表单的method为post,enctype=multipart/form-data

 <body>
    <form action="fileuploadAction1" method="post"  enctype=multipart/form-data>
                                              用户名:<input  type="text" name="username"><br/>
                                               文  件:<input  type="file" name="file"/><br/>
            <input type="submit" value="提交"> 
    </form>  
  </body>

       ②:处理文件上传的FileUpLoadAction1.java:

       

//处理文件上传的Action类
public class FileUpLoadAction1 extends ActionSupport {
	private String username;
	//重要代码:名字要和jsp页面的name名字一致
	private File file;
	//重要代码:名字必须为XXXFileName,其中XXX为上面的File的文件定义的变量名字
	private String fileFileName;
	//重要代码:名字必须为XXXContentType,其中XXX的意思和上面一样
	private String fileContentType;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public File getFile() {
		return file;
	}
	public void setFile(File file) {
		this.file = file;
	}
	public String getFileFileName() {
		return fileFileName;
	}
	public void setFileFileName(String fileFileName) {
		this.fileFileName = fileFileName;
	}
	public String getFileContentType() {
		return fileContentType;
	}
	public void setFileContentType(String fileContentType) {
		this.fileContentType = fileContentType;
	}
	//开始进行文件的上传处理
	@Override
	public String execute() throws Exception {
		//得到要上传文件放在某个根目录下面的目录名字
		String  rootPaht=ServletActionContext.getServletContext().getRealPath("/fileupload");
		//得到文件的输入流,
		//从Action开始提交进行上传文件开始:此时的file文件为一个临时文件,已经上传到服务器的默认的目录中(不过这个目录可以指定),
		//然后从该临时文件目录中把该要上传的文件,传到上面rootPath指定的目录中,到此,文件上传完毕
		InputStream is=new FileInputStream(file);
        File file=new File(rootPaht,fileFileName);
        OutputStream os=new FileOutputStream(file);
        byte[] buffer=new byte[1024];
        int lenth=0;
        while(-1!=(lenth=(is.read(buffer))))
        {
             os.write(buffer,0, lenth);	
        }
        os.close();
        is.close();
		return SUCCESS;
	}
      

           看上面的FileUpLoadAction1.java中的全局变量的属性名字定义有点特别:

  • private File file; file这个是文件对象的文件内容;
  • private String fileFileName;  这个属性是在文件上传页面的文件的文件名字
  • private String fileContentType;这个属性石文件上传页面的文件的文件类型

      上面可以使用一下的来代替:

  1. private File XXX;
  2. private String XXXFileName;
  3. private String XXXContentType:  这三个XXX的是一样的名字

       

      ③:在Struts.xml文件中的配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<package name="struts2" extends="struts-default">
		<action name="fileuploadAction1" class="com.jiangqq.action.FileUpLoadAction1">
			<result name="success">/result.jsp</result>
		</action>
	</package>
</struts>
       

       ④:当我们上面的所有工作做完之后,要在result.jsp文件中进行文件信息显示:

  <body>
    文件名:<s:property value="fileFileName"/><br/>
  文件类型:<s:property value="fileContentType"/>
  </body>
      上传成功的页面:

       

             

        【注意】使用Struts2进行文件上传,最重要的有三个属性1:文件内容.2:文件类型,3:文件名



     (四)下面简要的讲解一下多个文件的上传:

    看下多个文件上传页面和Action之间的区别即可,具体代码请点击下面的链接进行下载

        1:页面关键代码:

<body>
    <form action="fileuploadAction1" method="post"  enctype=multipart/form-data>
              username:<input  type="text" name="username"><br/>
              file1:<input type="file" name="file"><br/>
              file2:<input type="file" name="file"><br/>
              file3:<input type="file" name="file"><br/>
            <input type="submit" value="提交"> 
    </form>  
  </body>
       

          2:Action中关键代码:

        private String username;
	private List<File> file;
	private List<String> fileFileName;
	private List<String> fileContentType;
	@Override
	public String execute() throws Exception {

		for (int i = 0; i < file.size(); i++) {
			InputStream is = new FileInputStream(file.get(i));
			String root = ServletActionContext.getRequest().getRealPath(
					"/fileupload");
			File file = new File(root, fileFileName.get(i));
			OutputStream os = new FileOutputStream(file);
			byte[] buffer = new byte[1024];
			int length = 0;
			while (-1 != (length = is.read(buffer))) {
				os.write(buffer, 0, length);
			}

			os.close();
			is.close();
		}

		return SUCCESS;
	}
           3:输出上传的文件的信息:

     

	<body>
     username:<s:property value="username"/><br/>
	  <s:iterator value="fileFileName" id="f">
	    file:<s:property value="#f"/> <br/>
	  </s:iterator>  
	   <s:iterator value="fileContentType" id="f">
	    file:<s:property value="#f"/> <br/>
	  </s:iterator>
	  </body>
           

          至此简要的讲解了一下单个文件和多个文件的上传方法,有不到之处望多多指出,一起学习谢谢....

         

          代码下载链接地址:http://download.csdn.net/detail/jiangqq781931404/4196242

         

         

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值