目录
Spring文件上传与下载(MultipartFile对象)
文件上传
①表单的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;
}