(二十四)Struts2.x文件上传操作

        如果你的项目代码使用的是标准MVC开发的,那么强烈建议使用SmartUpload完成,但是如果你的项目代码使用的是框架开发,例如Struts1.x,Struts2.x,SpringMVC,那么就只能够使用FileUpload,因为这些框架针对于FileUpload的处理是比较方便的.

基础上传

        如果现在使用的是Struts1.x,那么要接收上传文件的时候使用的是一个FomFile类,但是这个类虽然包装了很多的内容,不过从实际来讲,有些多余,所以Struts2.x中的上传接收直接利用java.io.File类完成,这样的操作比较直观一些

范例:定义上传表单

<body>
   		<form action="UploadAction!insert.action" method="post" enctype="multipart/form-data">
   			姓名:<input type="text" name="name"><br>
   			照片:<input type="file" name="photo"><br>
   			<input type="submit" value="提交">
   		</form>
  </body>

        随后定义UploadAction,但是为了可以接受上传文件,使用File定义一个photo属性

范例:定义UploadAction

package cn.zwb.action;

import java.io.File;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class UploadAction extends ActionSupport {
	private String name;
	private File photo;
	public void setName(String name) {
		this.name = name;
	}
	public void setPhoto(File photo) {
		this.photo = photo;
	}
	public void insert(){
		System.out.println("姓名:"+this.name);
		System.out.println("照片:"+this.photo);
		System.out.println("文件大小:"+this.photo.length());
		
	}
}

范例:配置struts.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<package name="root" namespace="/" extends="struts-default">
		<action name="UploadAction" class="cn.zwb.action.UploadAction">
			
		</action>
	</package>
</struts>    

        随后运行项目代码,发现可以成功上传了,但是里面却出现有警告信息.因为在Struts2.x中实现的信息上传流程如下,首先会将上传的文件保存在一个临时文件夹中,而后在Action里面所读取的文件内容实际上就是这个临时文件夹中的信息内容,但是严格来讲应该自己定义一个这样的临时文件夹信息.

范例:在struts.properties文件中定义临时保存目录.

struts.multipart.saveDir=tempdiv

        此时文件已经可以正常上传了.

上传的进一步操作

        虽然此时可以由Action接收上传文件,那么并且也可以取得文件内容了,但是依然无法进行保存,因为我们不知道上传的文件是什么东西,在使用struts2.x上传的时候是将上传的内容先临时保存到了一个存储目录中,这个目录中所保存的文件是一个随意自动生成的名称,

        这个时候你无法知道你上传的文件类型以及文件的原始名称.

        如果要想得到文件的原始名称以及文件类型,则必须定义两个属性,如果说现在接收上传文件的属性名称为photo,则需要定义两个属性才可以接收;

            文件名称:photoFileName;

            文件名称:photoContentType;

范例:接收文件名称以及文件类型   

package cn.zwb.action;
import java.io.File;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class UploadAction extends ActionSupport {
	private String name;
	private File photo;
	private String photoFileName;
	private String photoContentType;
	public void setPhotoFileName(String photoFileName) {
		this.photoFileName = photoFileName;
	}
	public void setPhotoContentType(String photoContentType) {
		this.photoContentType = photoContentType;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setPhoto(File photo) {
		this.photo = photo;
	}
	public void insert(){
		System.out.println("姓名:"+this.name);
		System.out.println("照片:"+this.photo);
		System.out.println("文件大小:"+this.photo.length());
		System.out.println("原始文件名:"+this.photoFileName);
		System.out.println("原始文件类型:"+this.photoContentType);
	}
}

        既然文件的原始信息已经可以找到,那么对于用户而言那就可以进行文件的存储操作了,但是如果要进行文件保存一定需要设置一个保存的目录,同时也需要进行文件的一个名称的生成,考虑到所有的问题,下面可以单独定义一个类,这个类专门负责文件的保存.

范例:实现文件保存的工具类

package cn.zwb.util.upload;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class UploadFileUtil {
	private File uploadFile;  //保存上传文件的内容
	private String contentType;//保存上传文件的类型
	private UploadFileUtil(File uploadFile,String contentType){
		this.uploadFile=uploadFile;
		this.contentType=contentType;
	}
	/**
	 * 取得文件名称,根据uuid生成
	 * @return
	 */
	public String getFileName(){ //取得上传文件的名称
		String photoName=null;
		if("image/bmp".equals(this.contentType)){
			photoName="bmp";
		}else if("image/gif".equalsIgnoreCase(this.contentType)){
			photoName="gif";
		}else if("image/jpeg".equalsIgnoreCase(this.contentType)){
			photoName="jpg";
		}else if("image/png".equalsIgnoreCase(this.contentType)){
			photoName="png";
		}
		return java.util.UUID.randomUUID()+"."+photoName;
	}
	public boolean saveFile(String outFilePath)  throws IOException{
		File file=new File(outFilePath);
		OutputStream output=null;
		InputStream input=null;
		try{
			if(file.getParentFile().exists()){
				file.getParentFile().mkdirs();
			}
			output=new FileOutputStream(file);
			input=new FileInputStream(this.uploadFile);
			byte data[]=new byte[2048];//每次读取的内容
			int len=0;
			while((len=input.read())!=-1){
				output.write(data,0,len);
			}
			return true;
		}catch (Exception e) {
			throw e;
		}finally{
			if(output!=null){
				output.close();
			}
			if(input!=null){
				input.close();
			}
		}
	}
	public boolean deleteFile(String filePath){
		File file=new File(filePath);
		if(file.exists()){
			file.delete();
			return true;
		}
		return false;
	}
}

        随后在Action里面调用此类的方法进行文件的保存.

范例:在Action中保存信息

	public void insert(){
		UploadFileUtil ufu=new UploadFileUtil(this.photo,this.photoContentType);
		String filename=ufu.getFileName();
		System.out.println("新文件名称:"+filename);
		String filePath=ServletActionContext.getServletContext().getRealPath("/upload/")+filename;
		try {
			System.out.println(ufu.saveFile(filePath));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

文件上传操作

        现在虽然可以进行文件的上传了,但是上传是有一些限制的,也就是说它本身是有一些文件大小的限制.

1.改变上传文件的大小限制--修改strtus.properties文件;

以下为默认的上传文件的最大额限制;

struts.multipart.maxSize=2097152

         但是一般图片别弄得太大,除非你是那种专业的图片网站.但是如果文件一大,那么肯定要进行错误显示,也就是说应该继续配置一个imput的路径.修改struts.xml文件.

<struts>
	<package name="root" namespace="/" extends="struts-default">
		<action name="UploadAction" class="cn.zwb.action.UploadAction">	
			<result name="input">upload.jsp</result>
		</action>
	</package>
</struts>    

        这个时候如果文件太大,那么Struts2.x就出现了错误操作,但是虽然大的方向上不能够进行错误处理,但是可以在每一个Action中进行错误的配置;

范例:修改struts.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<package name="root" namespace="/" extends="struts-default">
		<action name="UploadAction" class="cn.zwb.action.UploadAction">	
			<interceptor-ref name="fileUpload">
					<param name="maxmumSize">10000</param>
					<param name="allowedTypes">
						image/bmp,image/jpg,image/jpeg,image/gif,image/png;
					</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<result name="input">upload.jsp</result>
		</action>
	</package>
</struts>    

        所有的错误引燃保存在了filedErrors集合里面.

         ${fieldErrors}

        但此时输出的错误的信息是英语,不是中文,可以在全局资源中定义显示的文字

范例:在Message.properties里面定义信息

struts.messages.error.file.too.large="上传文件过大"

struts.messages.error.content.type.not.allowed="上传文件类型不正确"

        Struts2.x的文件上传的确考虑了不少的情况.

总结

Struts2.x的文件上传的控制拦截是比较到位的,考虑到了代码使用的简洁性,以及代码操作的安全性,




        


猜你喜欢

转载自blog.csdn.net/qq1019648709/article/details/80610710
今日推荐