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

本文介绍如何使用Struts2框架结合Hibernate进行文件上传,包括配置文件类型限制、文件大小限制及错误处理,实现文件的唯一命名和存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

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

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

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

按照JDBC规定找到其get方法

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

<action name="user_*" class="customerAction" method="{1}">
	<interceptor-ref name="defaultStack">
		<!-- 为fileUpload拦截器设置参数,	设置上传文件类型。 -->
		<param name="fileUpload.setAllowedExtensions">.jpg,.jpeg,.png</param>
	</interceptor-ref>

</action> 

 

 

需要注意的是在前台页面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

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

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

	<!-- 设置上传文件大小 -->
	<constant name="struts.multipart.maxSize" value="20971520"></constant>

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

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

<result name="input">/jsp/error.jsp</result>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值