首先需要下载两个apache上传文件的jar包
commons-fileupload-1.3.1.jar
commons-io-2.4.jar
具体使用版本,请根据项目进行选择。
SpringMVC 用的是 的MultipartFile来进行文件上传 所以我们首先要配置MultipartResolver:用于处理表单中的file。
id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5400000" />
<property name="defaultEncoding" value="UTF-8" />
属性介绍:
maxUploadSize:最大上传文件的大小,单位为字节;
defaultEncoding:请求的编码格式,默认为iso-8859-1。
@Controller
public class FileUploadController {
private static String UPLOAD_DIRECTORY = PropertiesUtil.get("fileupload.directory", "");
@RequestMapping(value = "uploadFile", method = RequestMethod.POST)
public ModelAndView uploadFile(@RequestParam("file") MultipartFile file){
// 判断文件是否为空
if (!file.isEmpty()) {
try {
//判断文件目录是否存在,否则自动生成
File directory = new File(UPLOAD_DIRECTORY);
if (!directory.exists()){
directory.mkdirs();
}
//失败跳转视图
if (file.getSize() > 30000)
return new ModelAndView("uploadFail","msg",file.getOriginalFilename()+"超过了指定大小");
// 文件保存路径
String filePath = FilenameUtils.concat(UPLOAD_DIRECTORY, file.getOriginalFilename());
// 转存文件
file.transferTo(new File(filePath));
} catch (Exception e) {
e.printStackTrace();
}
}
//成功跳转视图
return new ModelAndView("uploadSuccess","msg",file.getOriginalFilename());
}
}
说明:
1>使用SpringMVC注解@RequestParam来获取表单中的file参数内容;
2>通过MultipartFile的transferTo(File dest)这个方法来直接转存文件到指定的路径。
upload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Upload Filetitle>
head>
<body>
<h2>文件上传实例h2>
<form action="/uploadFile" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="file">
<input type="submit" value="提交">
form>
body>
html>
uploadSuccess.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传成功title>
head>
<body>
<h1>文件${msg}上传成功!h1>
body>
html>
uploadFail.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传失败title>
head>
<body>
<h1>上传失败原因:${msg}h1>
body>
html>
注意要在form标签中加上enctype=”multipart/form-data”表示该表单是要处理文件的,这是最基本的东西,很多人会忘记然而当上传出错后则去找程序的错误,却忘了这一点
步骤1,2都是相同的,只是步骤3,4有些许不同。
/**
* 多个文件上传
* @param files
* @return
*/
@RequestMapping(value = "uploadFiles", method = RequestMethod.POST)
public ModelAndView uploadFile(@RequestParam("files") MultipartFile[] files){
//判断file数组不能为空并且长度大于0
if (files != null && files.length > 0) {
//循环获取file数组中得文件
for (int i = 0; i < files.length; i++) {
MultipartFile file = files[i];
//保存文件
String filePath = FilenameUtils.concat(UPLOAD_DIRECTORY, file.getOriginalFilename());
// 转存文件
try {
file.transferTo(new File(filePath));
} catch (IOException e) {
e.printStackTrace();
}
}
}
//跳转视图
return new ModelAndView("uploadSuccess","msg",files.length+"个文件");
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Upload Filetitle>
head>
<body>
<h2>多个文件上传实例h2>
<form action="/uploadFiles" method="post" enctype="multipart/form-data">
<p> 选择文件:<input type="file" name="files">
<p> 选择文件:<input type="file" name="files">
<p> 选择文件:<input type="file" name="files">
<input type="submit" value="提交">
form>
body>
html>
说明:
前端表单,多个文件组使用同一个name名称:files,后台控制器使用@RequestParam(“files”) MultipartFile[] files 数组来接收。
Github上源码:https://github.com/ChasingLight/SpringDataJPA.git
打印方法结果:
1>文件类型值,MultipartFile.getContentType():image/jpeg
2>表单中文件组件对应name值,MultipartFile.getName():file
3>文件原始名称包括后缀名,MultipartFile.getOriginalFilename():IMEI_20171204.jpg
4>文件大小单位为k,MultipartFile.getSize():27128
5>文件是否为空,MultipartFile.isEmpty():false
1>FilenameUtils.concat(basePath, fullFileName):用于拼接目录和文件名为文件全路径,且会根据系统对应使用相应的分隔符
2>FileUtils.copyURLToFile(URL source, File destination, int connectionTimeout, int readTimeout):
从指定的url下载文件,保存到destination为准;同时指定连接超时时长,读取文件超时时长。