文件的上传

发表时间:2017-05-16 15:45:07 浏览量( 28 ) 留言数( 0 )

学习目标:

1、了解使用Struts2的文件上传


学习过程:

一、准备工作

Struts2本身并没提供上传的组件,我们可以通过使用第三方的上传框架来实现文件的上传。我们在前面讲解struts.properties属性文件中通过,配置代码如下:

### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
# 保存的临时文件
struts.multipart.saveDir=
#上传最大文件的大小设置
struts.multipart.maxSize=20971520

在这里struts支持使用cos、pell、jakarta三种方式上传文件,默认使用的是jakarta。jakarta是Commo-FileUpload的框架,所以我们需要导入其支持包,这两个包其实我们早就导入了。就是“commons-fileupload-1.x.x.jar”和“commons-io-1.x.x.jar”。下面两个配置的功能分别是设置临时的保存位置,和支持的最大文件大小,默认是2M。

二、完成页面

页面和我们之前使用servlet的方式是一样的,要表单必须是使用post提交,而且要修改enctype属性为multipart/form-data。代码如下:

<body>
		<form action="adduser.action" method="post" enctype="multipart/form-data">
			用户名:
			<input name="user.username" />
			<br />
			密码:
			<input name="user.passwd" />
			<br />
			地址:
			<input name="user.addr" />
			
			<br />
			头像:
		    <input name="head" type="file"/>
			<input type="submit" />
		</form>
	</body>

三、完成后台的Action实现

后台的action实现比较简单,示例代码如下:

public class UserAction extends ActionSupport{
	
	private User user;
	private File head;//对应页面的控件
	private String headContentType;// 文件的类型[fileName]ContenType
	private String headFileName;//原始的文件名称[fileName]ContenTypeFileName
	
	public String adduser(){
		
		System.out.println("用户名:"+user.getUsername());
		
		System.out.println(head);
		System.out.println("文件的类型"+headContentType);
		System.out.println("原始的文件名称"+headFileName);
		
		//1、如何获得项目的路径
		String realPath=ServletActionContext.getServletContext().getRealPath("head");
		//System.out.println(realPath);
		//把文件复制你想要保存的位置
		try {
			FileUtils.copyFile(head, new File(realPath, UUID.randomUUID()+headFileName.substring(headFileName.lastIndexOf("."))));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return SUCCESS;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public File getHead() {
		return head;
	}

	public void setHead(File head) {
		this.head = head;
	}

	public String getHeadContentType() {
		return headContentType;
	}

	public void setHeadContentType(String headContentType) {
		this.headContentType = headContentType;
	}

	public String getHeadFileName() {
		return headFileName;
	}

	public void setHeadFileName(String headFileName) {
		this.headFileName = headFileName;
	}

}


四、修改action的配置文件

<action name="adduser" class="com.action.UserAction" method="adduser">
			<result>/success.jsp</result>
			<result name="input">/error.jsp</result>
			<interceptor-ref name="fileUpload">
				<!-- 文件的大小 -->
				<param name="maximumSize">
					2097152
				</param>
				<!-- 文件的类型 -->
				<param name="allowedTypes">
					image/png,image/gif,image/jpeg
				</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
</action>

有的时候不同的浏览器的对文件的类型不一样的,如下面所示:

firefox 和 ie 的文件类型区别 

Firefox:image/jpeg, image/bmp, image/gif, image/png 

ie 6: image/pjpeg ,image/bmp, image/gif, image/x-png 

ie 7:image/pjpeg, image/bmp, image/gif, image/x-png 

ie 8:image/pjpeg, image/bmp, image/gif, image/x-png 

ie 9:  image/jpeg, image/bmp, image/gif, image/png 

所以在struts.xml配置文件中如下这样配置才能在适应不同的浏览器:

<param name="allowedTypes">
      image/bmp,image/png,image/gif,image/jpeg,image/jpg,
      image/pjpeg ,image/bmp, image/gif, image/x-png,
</param>