上传文件 Spring框架

##上传文件 Spring框架
####1、创建WEB页面
文件上传的HTML页面中需要表单,且method="postenctype="multipart/form-data",使用的控件是<input type="file" />

<form method="post"  action="upload.do"
	enctype="multipart/form-data">
	<div><input name="file" type="file" /></div>
	<div><input type="submit" value="上传" /></div>
</form>

####2. 添加依赖
SpringMVC中的文件上传依赖apache的commons-fileupload,所以,添加依赖:

<!-- 文件上传 -->
<dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.3.3</version>
</dependency>

####3. 配置CommonsMultipartResolver
使用SpringMVC的上传,必须在Spring的配置文件中配置CommonsMultipartResolver,且id必须是multipartResolver,该节点可以有更多配置,也可以不添加配置,最简化配置如下:

<!-- CommonsMultipartResolver -->
<bean id="multipartResolver"
	class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

####4. 创建控制器处理请求
在服务器端处理上传请求时,需要将用户提交的上传文件声明为CommonsMultipartFile类型,它表示用户上传的文件,调用该参数对象的transferTo(File)方法即可将文件保存在服务器端的某个位置,通常,推荐将文件保存在webapp目录下,以便于用户可以通过HTTP协议进行访问,并且,通常还会专门创建某个文件夹,用于存储用户上传的文件,通过HttpServletRequest对象的getServletContext.getRealPath(String)方法可以获取到webapp下某文件夹的实际路径:

@Controller
public class UploadController {

	@RequestMapping("/upload.do")
	public String handleUpload(
			HttpServletRequest request,
			@RequestParam("file") CommonsMultipartFile file) 
				throws IllegalStateException, IOException {
		// CommonsMutltpartFile是SpringMVC封装的上传数据
		String parentPath = request
			.getServletContext().getRealPath("upload");
		// 确定文件夹,是webapp下的upload
		File parentFile = new File(parentPath);
		// 确定文件名
		String fileName = "1.jpg";
		// 确定上传的文件存储到的目标文件
		File dest = new File(parentFile, fileName);
		// 将上传的数据进行存储
		file.transferTo(dest);
		return null;
	}
}

通常,上传的文件都必须限制文件类型,可以通过CommonsMultipartFile对象的String getContentType()方法获取文件的MIME类型,例如image/jpeg,更多类型可以在Tomcat的conf/web.xml中查找。

且上传的文件必须限制文件大小,因为过大的文件可能导致上传体验较差,并且,产生的流量消耗较大,占用较多的服务器端存储空间,通过CommonsMultipartFile对象的long getSize()方法可以获取文件的大小,例如12345,是以字节为单位的。

还可以通过CommonsMultipartFile对象的String ``getOriginalFileName()方法获取原始文件名,即用户端的文件名,主要通过该文件名截取出文件的扩展名,用于最终保存文件。

最终保存的文件名应该自定义命名规则,以保证每个用户上传的文件彼此不会覆盖,通常会使用时间、随机数等作为文件名的某个部分。

除此以外,还可以通过getBytes()getInputStream()获取用户上传的原始数据/流,然后自行创建输出流,将数据写入到服务器端的文件中,而自定义输出流的写入,可以根据实际情况提高写入效率!

关于在Spring的配置文件中配置的CommonsMultipartResolver,可以配置以下属性:

  • maxUploadSize:最大上传大小,即每次上传的文件不允许超过多少字节!假设同时上传5个文件,则5个文件的大小总和不允许超过设置值。
  • maxUploadSizePerFile:每个上传的文件不允许超过多少字节,因为单次上传其实可以选中多个文件!假设同时上传5个文件,则每个文件的大小都不允许超过设置值,而5个文件的总大小允许超过设置值。.
  • maxInMemorySize:上传的文件在内存中最大占多少空间。
  • defaultEncoding:默认编码。

注意:在HTML页面中,在<input type="file" />标签中添加multiple="multiple",则上传时可以同时选中多个文件提交上传,且,在服务器端处理时,处理请求的方法中应该声明CommonsMultipartFile[] files参数来接收多个文件的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值