单文件上传和多文件上传

J2EE开发各类资源下载清单,  史上最全IT资源,个人收藏总结!


1. 单文件上传:

struts-fileupload.xml

<struts>
  <constant name="struts.configuration.xml.reload" value="true"></constant>
  <!-- 限制了一次上传文件总数最大为10M,默认为2M
       当单个文件或文件数组和大小大于2Mb时,会抛出org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: 
   the request was rejected because its size (2667603) exceeds the configured maximum (2097152)
   -->
  <constant  name="struts.multipart.maxSize" value="10701096"></constant>
  <package name="upload" namespace="/upload" extends="struts-default">
     <action name="one" class="edu.action.OneFileUploadAction" method="singleFile">
        <result name="onemessage">/page/uploadmessage.jsp</result>
     </action>
     <action name="many" class="edu.action.ManyFileUpload" method="manyFile">
        <result name="manymessage">/page/manyfilemessage.jsp</result>
     </action>
  </package>
  
</struts>


OneFileUploadAction.java

package edu.action;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
public class OneFileUploadAction {
	private String userName;
	private File image;
	private String imageFileName;
	private String imageContentType;
	
	public String singleFile() throws IOException {
	    //将文件保存在/image/下,得到文件的真实路径
		String realPath = ServletActionContext.getServletContext().getRealPath("/image");
		if (image!=null)
		{
			//得到上传文件路径
			File imageFile = new File(new File(realPath),imageFileName);
			if (!imageFile.getParentFile().exists()) {
				imageFile.getParentFile().mkdirs(); //包含多级目录创建
			}
			//struts在执行下句之前,会将上传的文件放进临时目录下,执行下句后,将临时文件copy进真实目录下后,会remove掉临时文件
			FileUtils.copyFile(image, imageFile);
			ActionContext.getContext().put("message", "上传成功!");
			//测试二进制数据下userName属性是否乱码
			System.out.println("上传者:"+userName+",文件名:"+imageFileName+",文件类型:"+imageContentType+",状态:上传成功");	
		}
		return "onemessage";
	}
	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getImageFileName() {
		return imageFileName;
	}
	//文件名定义格式"File名+FileName"
	public void setImageFileName(String imageFileName) {
		this.imageFileName = imageFileName;
	}
	//与表单的<input type="file" name="image">属性名相同
	public void setImage(File image) {
		this.image = image;
	}
	//文件类型名称定义格式"File名+ContentType"
	public void setImageContentType(String imageContentType) {
		this.imageContentType = imageContentType;
	}
}
上传成功后,控制台打印: 上传者:肖华,文件名:2012_03130103.JPG,文件类型:image/jpeg,状态:上传成功

OneFileUpload.jsp

<body>
    <form action="${pageContext.request.contextPath}/upload/one" enctype="multipart/form-data" method="post">
       姓名:<input type="text" name="userName"><br/>
      照片:<input type="file" name="image"><br/>
      <input type="submit" value="regist">
    </form>
  </body>

uploadmessage.jsp

<body>
      ${userName}:${imageFileName}:${message}
  </body>

总结:

     第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。这两个文件可以从http://commons.apache.org/下载。

     第二步:把form表的enctype设置为:“multipart/form-data“,如下:

       <form action="${pageContext.request.contextPath}/upload/one"enctype="multipart/form-data" method="post">
         姓名:<input type="text" name="userName"><br/>
         照片:<input type="file" name="image"><br/>
            <input type="submit" value="regist">
       </form>

     第三步:在Action类中添加以下属性,属性红色部分对应于表单中文件字段的名称,属性蓝色部分是固定格式:

public class HelloWorldAction{

  private File uploadImage;//得到上传的文件

  private String uploadImageContentType;//得到文件的类型

  private String uploadImageFileName;//得到文件的名称

  //这里略省了属性的getter/setter方法,提供了setter方法后,struts2会自动调用setter方法,为其赋值

       }

    注意:(1)struts默认一次性最大文件上传大小为2Mb,所以如果单个文件或文件数组之和大小大于2Mb的话,会抛出:org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (2667603) exceeds the configured maximum (2097152)
    所以应该在struts.xml文件中配置常量控制文件上传最大大小。

   <constant  name="struts.multipart.maxSize" value="10701096"></constant>

        (2)如果/image文件下存在同名的文件,则后者将覆盖前者,而不会报告任何错误。

        (3)struts2对表单的中文乱码处理的很好,以及对enctype="multipart/form-data"表单中字符处理的很好,无需程序员手工处理!

2. 多文件上传:ManyFileUploadAction.java

   ManyFileUploadAction.java

package edu.action;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
public class ManyFileUploadAction {
    private String userName;
    private File[] image; //这里可以使用List或数组保存
    private String[] imageFileName;//这里可以使用List或数组保存
   public String manyFile() throws IOException {
       //将文件保存在/image/下,得到文件的真实路径
        String realPath = ServletActionContext.getServletContext().getRealPath("/image");
        if (image!=null)
        {
            //得到上传文件目录
            File imageDir = new File(realPath);
            if (!imageDir.exists()) {
                imageDir.mkdirs(); //包含多级目录创建
            }
            for (int i = 0; i < image.length; i++) {
                File imageFile = new File(imageDir,imageFileName[i]);
                FileUtils.copyFile(image[i], imageFile);
            }
            ActionContext.getContext().put("count", image.length);
        }
       return "manymessage";
   }

    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String[] getImageFileName() {
        return imageFileName;
    }
    public void setImageFileName(String[] imageFileName) {
        this.imageFileName = imageFileName;
    }
    public void setImage(File[] image) {
        this.image = image;
    }
}


manyFileUpload.jsp

  <body>
    <form action="${pageContext.request.contextPath}/upload/many" enctype="multipart/form-data" method="post">
       姓名:<input type="text" name="userName"><br/>
      照片1:<input type="file" name="image"><br/>
      照片2:<input type="file" name="image"><br/>
      照片3:<input type="file" name="image"><br/>
      <input type="submit" value="regist">
    </form>
  </body>

manyfilemessage.jsp

  <body>
       用户名:${userName},照片个数:${count}<br>
   <c:forEach var="imageName" items="${imageFileName}">
      ${imageName}:<img src="${pageContext.request.contextPath}/image/${imageName}" weight="200px" height="200px"/><br/>
   </c:forEach>
  </body>

 浏览器:

    

点击regist按钮:


这里对于

<img src="${pageContext.request.contextPath}/image/${imageName}" weight="200px" height="200px"/>

如果文件名包含中文时,则无法显示,不知道为什么?? 

总结:

     (1)对于多文件上传时,文件文本框的name属性须相同,在Action中多个文件,可以用数组和List集合保存。

     (2)没有上传文件的文件文本框,struts2不会将其传给struts的Action,从上面的length=2可以看出。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值