9.Spring文件上传与下载(MultipartFile对象)

目录


Spring MVC专栏目录(点击进入…)



文件上传

①表单的method设置为POST
②enctype属性为multipart/form-data
只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器。enctype设置为multipart/form-data表示采用二进制流处理表单数据,即浏览器会采用二进制流的方式来处理表单数据。


MultipartFile对象常用方法

方法描述
byte[] getBytes()获取文件数据
String getContentType[]获取文件MIME类型,如image/jpeg等(后缀)
InputStream getInputStream()获取文件流
String getName()获取表单中文件组件的名字
String getOriginalFilename()获取上传文件的原名
Long getSize()获取文件的字节大小,单位为byte
boolean isEmpty()是否有上传文件
void transferTo(File dest)将上传文件保存到一个目录文件中

单文件上传

Spring MVC为文件上传提供了直接的支持,即MultipartResolver接口。MultipartResolver用于处理上传请求,将文件上传请求包装成可以直接获取文件的数据,从而方便操作。

它有两个实现类:StandardServletMultipartResolver和CommonsMultipartResolver

实现类描述
StandardServletMultipartResolver使用了Servlet 3.0标准的上传方式
CommonsMultipartResolver使用了Apache的Commons-fileupload来完成具体的上传操作

1.导入jar文件

在这里插入图片描述

2.配置MultipartResolver

首先使用CommonsMultipartResolver配置一个multipartResolver解析器。

<mvc:annotation-driven />
<context:component-scan base-package="com.my.controller" />

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/jsp/"></property>
	<property name="suffix" value=".jsp"></property>
</bean>

<!-- 文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<property name="maxUploadSize" value="10241111"></property>
	<property name="defaultEncoding" value="utf-8"></property>
</bean>

defualtEncoding:请求编码格式,默认为ISO-8859-1(设置必须和JSP的pageEncoding设置一致)。
maxUploadSize:上传文件大小上限,单位为字节。

3.编写表单

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

4.编写控制器

@RequestMapping("/upload")
public String upload(@RequestParam("up") MultipartFile up) {
	// 获取文件类型
	System.out.println(up.getContentType());
	// 获取文件原始名称
	System.out.println(up.getOriginalFilename());
	// 获取文件大小
	System.out.println(up.getSize());
	// 文件input的name
	System.out.println(up.getName());

	try {
		File file = new File("D:\\" + up.getOriginalFilename());
		FileUtils.copyInputStreamToFile(up.getInputStream(), file);// 文件流
	} catch (IOException e) {
		e.printStackTrace();
	}
	System.out.println("上传成功!");
	return "upload";
}

多文件上传

1.表单

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

2.Controller

@RequestMapping("/upload")
public String upload(@RequestParam("imgs") MultipartFile[] imgs) {
	// 创建一个磁盘目录用于保存文件
	File destFile = new File("c:/upload");
	if (!destFile.exists()) {
		destFile.mkdir();
	}
	
	// 遍历上传的文件
	for (int i = 0; i < headImgs.length; i++) {
		MultipartFile headImg = headImgs[i];
		// 使用uuid作为文件随机名称
		String fileName = UUID.randomUUID().toString().replaceAll("-", "");
		// 使用FileNameUtils获取上传文件名的后缀        // jpg,png等等
		String extension = FilenameUtils.getExtension(headImg.getOriginalFilename());
		// 创建新的文件名称
		String newFileName = fileName + "."+extension;
		// 创建要保存文件的File对象
		File file = new File(destFile, newFileName);
		// 保存文件到本地磁盘
		try {
			headImg.transferTo(file);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	return "upload";
}

Ajax上传

1.Ajax脚本

ajax的特点:异步请求,局部刷新。

<script type="text/javascript">
	$(function() {
		$("#file").change(function() {
			var data = new FormData($("#form")[0]);
			$.ajax({
				type: "post",
				url: "uploadFile1",
				data: data,
				cache: false,
				processData: false,
				contentType: false,
				beforeSend: function() {},
				success: function(msg) {
					$("img").attr("src", msg);
				},
				error: function() {
					alert("网络异常!")
				}
			});
		});
	});
</script>

<form method="post" enctype="multipart/form-data" id="form">
	<input type="file" name="file" id="file"><img style="width: 100px;height: 100px"><br>
</form>

2.Controller控制器

@RequestMapping("/uploadFile")
@ResponseBody//局部刷新
public String uploadFile1(MultipartFile file ,HttpServletRequest request){
	//把文件保存在指定路径
	String path = request.getServletContext().getRealPath("imgs");
	File destFile = new File(path + "/" + file.getOriginalFilename());
	try {
		InputStream in = file.getInputStream();
		FileUtils.copyInputStreamToFile(in,destFile);
	} catch (IOException e) {
		e.printStackTrace();
	}
	String msg = "imgs/"+file.getOriginalFilename();
	return msg;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未禾

您的支持是我最宝贵的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值