Struts2最新版(2.5.12)快速入门(五) struts2之文件上传

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37992075/article/details/77155943

        为了我们在开发中的文件上传变得更加简便,struts2框架为我们提供了HTML中form表单的文件上传的功能,使用和配置起来及其方便,很大的提升了开发效率!

        一、struts2文件上传原理
                      struts2的文件上传也是基于拦截器来实现的,在我们的前端HTML中的form表单提交到Action来的时候,会把使用拦截                器把提交请求拦截起来,然后再做相应的上传处理,上传一个文件时,它通常会被存储在一个临时目录中,并且把临时文件路                 径、文件类型、文件名赋给Action中相对应的变量,再由我们在Action中对文件进行处理或移动到一个永久的目录,以确保数据不                 丢失。
        二、创建文件上传Action类
                 1、**单文件上传**
                         1、对应的html代码
					<form action="upload.action" method="post" enctype="multipart/form-data">
						<input type="file" name="myFile" />
						<input type="submit"/>
					</form>

                         2、文件上传action类
						package com.example.action;


						import java.io.File; 
						import java.util.UUID;


						import javax.servlet.http.HttpServletRequest;
						import javax.servlet.http.HttpServletResponse;


						import org.apache.commons.io.FileUtils;
						import org.apache.struts2.ServletActionContext; 
						import org.apache.struts2.convention.annotation.Action;


						public class UploadAction {
							//设置三个默认的属性
							//这里的文件名要与表单中的 file的name属性一致
							private File myFile;
							private String myFileContentType;//上传文件的类型
							private String myFileFileName;	//文件名
							
							public String upload() throws Exception{
								HttpServletRequest request=ServletActionContext.getRequest(); 
								String uploadPath=request.getRealPath("/upload");	//获得项目中upload的路径
								UUID uuid=UUID.randomUUID();//获得一个唯一标识符用来作为上传后的文件名
								String newFileName=uuid.toString();
								String suffix=myFileFileName.substring(myFileFileName.lastIndexOf(".");//截取后缀名	
								File destFile=new File(uploadPath+"/"+newFileName+suffix);	//destFile是我们要移动到的目标文件
								FileUtils.copyFile(myFile, destFile);//将struts2给我们的myFile临时文件复制到destFile目标文件
								return "success";
							}


							public File getMyFile() {
								return myFile;
							}


							public void setMyFile(File myFile) {
								this.myFile = myFile;
							}


							public String getMyFileContentType() {
								return myFileContentType;
							}


							public void setMyFileContentType(String myFileContentType) {
								this.myFileContentType = myFileContentType;
							}


							public String getMyFileFileName() {
								return myFileFileName;
							}


							public void setMyFileFileName(String myFileFileName) {
								this.myFileFileName = myFileFileName;
							}
							
							
						}



  这里是我们自己创建的单文件上传Action类,和其他action类不同的是,这个类我们要设定几个struts2默认的属性,并且给出 set/get方法。创建action类之前,我们先要保证HTML中的form表单中的 enctype属性值要设为multipart/ form-data(以数据二进制 的类型上传)
                 2、**多文件上传**
                                 1、对应的html代码
					<form action="upload.action" method="post" enctype="multipart/form-data">
						<input type="file" name="myFile" />
						<input type="file" name="myFile" />
						<input type="submit"/>
					</form>	

                                 2、文件上传action类

						package com.example.action;


						import java.io.File; 
						import java.util.UUID;


						import javax.servlet.http.HttpServletRequest;
						import javax.servlet.http.HttpServletResponse;


						import org.apache.commons.io.FileUtils;
						import org.apache.struts2.ServletActionContext; 
						import org.apache.struts2.convention.annotation.Action;


						public class UploadAction {
							//这里的文件名要与表单中的 file的name属性一致
							private List<File> myFile;
							private List<String> myFileContentType;//上传文件的类型
							private List<String> myFileFileName;	//文件名
							
							public String upload() throws Exception{
								HttpServletRequest request=ServletActionContext.getRequest(); 
								String uploadPath=request.getRealPath("/upload");	//获得项目中upload的路径
								for(int i=0;i<myFile.size();i++){
									UUID uuid=UUID.randomUUID();//获得一个唯一标识符用来作为上传后的文件名
									String newFileName=uuid.toString();
									String suffix=myFileFileName.get(i).substring(myFileFileName.get(i).lastIndexOf(".");//截取后缀名	
									File destFile=new File(uploadPath+"/"+newFileName+suffix);	//destFile是我们要移动到的目标文件
									FileUtils.copyFile(myFile.get(i), destFile);//将struts2给我们的myFile临时文件复制到destFile目标文件
								}
								
								return "success";
							}


							public List<file> getMyFile() {
								return myFile;
							}


							public void setMyFile(List<file> myFile) {
								this.myFile = myFile;
							}


							public List<String> getMyFileContentType() {
								return myFileContentType;
							}


							public void setMyFileContentType(List<String> myFileContentType) {
								this.myFileContentType = myFileContentType;
							}


							public List<String> getMyFileFileName() {
								return myFileFileName;
							}


							public void setMyFileFileName(List<String> myFileFileName) {
								this.myFileFileName = myFileFileName;
							}		
						}
                这里多文件上传action类的原理其实是一样的,只是,把我们设置的属性改成List,我们多文件上传的时候要注意,HTML表单里面的file类型的input标签的name属性都要设为与action中File类型的List属性名一致。
         三、配置文件
                我们上面所讲的都是使用struts2的默认配置上传的,并没有配置上传文件的大小,类型等,单在我们平常的开发中都是需啊这些设置的。
                 设置上传大小,上传文件类型
	 		<action name="upload" class="com.example.action.UploadAction" method="upload">
	 			<interceptor-ref name="defaultStack">
	 				<param name="fileUpload.maximumSize">20000</param><!-- 以字节为单位 -->
	 				<param name="fileUpload.allowedTypes">image/gif,image/jpg</param>
	 			</interceptor-ref>
	 			<result name="success">/index.jsp</result>
	 		</action>
                如果我们要上传 zip,rar压缩包的话,fileUpload.allowedTypes中的配置可改为如下,为了保证浏览器兼容,建议全部设置上
                                 zip文件
                                                firefox : application/octet-stream
                                                chrome : application/octet-stream
                                                oprea : application/zip
                                                IE : application/x-zip-compressed
                                 rar文件
                                                     firefox : application/x-rar-compressed
                                                chrome : application/octet-stream
                                                oprea : application/x-rar-compressed
         四、错误信息
fileUplaod拦截器使用几个默认的错误消息:
                                1、struts.messages.error.uploading
                                无法上传文件时发生的一般错误。
                                2、struts.messages.error.file.too.large
                                当上传的文件太大时,由maximumSize指定。
                                3、struts.messages.error.content.type.not.allowed
                                当上传的文件与指定的预期文件类型不匹配时发生。

猜你喜欢

转载自blog.csdn.net/m0_37992075/article/details/77155943