SSH框架整合 - 06 使用hibernate 实现文件上传

 

使用hibernate框架来实现文件上传箱单简单,它提供了FileUpload拦截器用于解析multipart/form-data的编码请求。

此拦截器在struts2.core核心包中的struts-default.xml的defaultStack中,默认会执行。

SSH框架整合 - 06 使用hibernate 实现文件上传_第1张图片

 在下图中可以看到fileupload拦截器是指向到FileUploadIntercepter类中的

SSH框架整合 - 06 使用hibernate 实现文件上传_第2张图片

进到这个类中可以看到其中有allowdExtensionSet是可以指定上传文件类型的。

SSH框架整合 - 06 使用hibernate 实现文件上传_第3张图片

按照JDBC规定找到其get方法

SSH框架整合 - 06 使用hibernate 实现文件上传_第4张图片

这个可以在struts.xml对应action中设置


	
		
		.jpg,.jpeg,.png
	

 

 

 

需要注意的是在前台页面form表单中使用post提交方式和设置enctype="multipart/form-data"属性,input标签一定要指定name,这个name属性在action中会起到作用。

 

 

再说action中使用hibernate上传文件需要在其中定义三个属性并定义set方法,这里就要用到之前input中指定的name属性了,

第一个变量为File类型 变量名为name属性的值

第二个变量为String类型 变量名为 name属性的值+ContentType

第三个变量为String类型 变量名为 name属性的值+FileName

        private File upload;
	private String uploadContentType;
	private String uploadFileName;
	public void setUpload(File upload) {
		this.upload = upload;
	}
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}

下面测试方法

public String add() throws IOException {
		
	System.out.println(upload.getName());
	System.out.println(uploadContentType);
	System.out.println(uploadFileName);
		
	return NONE;
}

这样可以获得File类型的对象、文件格式以及Sting类型的文件类型与文件名。

保存上传文件可以用apache的FileUtils类提供的copyFile方法来复制到新位置实现,具体代码如下:

    /*
     * 	保存的文件对象
     * 	D:\\www\\apache-tomcat-8.5.32\\webapps
     */
    String filePath = "D:\\www\\apache-tomcat-8.5.32\\webapps\\upload\\images\\";
    String fileName = filePath + FileUploadUtils.getUniqueFileName(uploadFileName);
    File localFile = new File(fileName);
    //使用apache的文件工具拷贝文件
    FileUtils.copyFile(upload, localFile);

这里我使用了一个方法将原文件名改为了用UUID命名的随机文件名。

package utils;

import java.util.UUID;

/**
 * 	上传文件所需的工具类
 * @author Administrator
 *
 */
public class FileUploadUtils {

	
	/*
	 * 	将文件名组合成唯一文件名的方法
	 */
	public static String getUniqueFileName(String FileName) {
		
		//获得文件后缀名
		String[] split = FileName.split("\\.");
		String suffix = "." + split[split.length - 1];
		String randomUUID = UUID.randomUUID().toString().replaceAll("-", "");
//		long currentTimeMillis = System.currentTimeMillis();
//		return currentTimeMillis + suffix;
		return randomUUID + suffix;
		
	}

	
	
}

这样就可以将文件存储到相应的位置了,我存到了tomcat的webapps目录是为了方便引用。

要完善这个上传文件还需要有一些修改的地方:

在struts2.core核心包的default.properties中可以看到上传文件是有大小限制的,超过2M就会拒绝请求。

途中几个属性分解为:

                * struts.multipart.parser=jakarta        -- 默认文件上传解析器,就是FileUpload组件
                * struts.multipart.saveDir=                -- 文件上传的临时文件存储目录
                * struts.multipart.maxSize=2097152        -- 文件上传的最大值(总大小),默认是2M

只设置总大小就可以,其他的先不用管。

SSH框架整合 - 06 使用hibernate 实现文件上传_第5张图片

在struts.xml中struts标签中设置常量,加一个0就是20M了。

	
	

同时在上传文件超过设置总大小的时候会报404错误找不到input action

这就需要在对应的action中设置一个name=input 的result,这样再有错误发生就会跳转至你指定的页面了,至于原因很复杂建议
查看相关文档。

/jsp/error.jsp

 这样就完成了整个上传过程。

你可能感兴趣的:(JAVA,SSH)