MultipartFile是在web中对文件上传的一个组件,关于怎么使用,在这里做一个简单的demo
—— @Yelihu 2018年9月20日 00:36:21
*若非特殊说明,本博客所有项目都由Intellij IDEA开发,(或者相同公司的产品)
1.在maven中,首先导入apache commons uploadfile的包。在respository中搜索uploadfile即可,选择1.31或者1.33版本的随意,复制粘贴在pom.xml,若不是maven项目,则需要下载添加相应的jar包
2.注册文件上传解析器,在spring的配置文件里面(属性的作用如注解标识)
<!--springMVC文件上传解析器-->
<bean id="exceptionResolver" class="com.fh.resolver.MyExceptionResolver"></bean>
<!--id必须是exceptionResolver这个名字,源代码中已经写死-->
<!-- 上传拦截,如最大上传值及最小上传值 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
<!--定义上传的最大大小,单位为byte-->
<property name="maxUploadSize">
<value>104857600</value>
</property>
<property name="maxInMemorySize">
<value>4096</value>
</property>
<!--指定上传的默认编码-->
<property name="defaultEncoding">
<value>utf-8</value>
</property>
</bean>
ps.属性补充:
3.前端代码文件提交部分:*注意:由于上传所遵循的传输协议要求特殊,所以要在前端提交表单的时候添加一个属性 enctype即encoding type 文件上传的内容在正文,必须使用POST请求而不是GET
<form action="/plan/uploadtest" method="post" class="form-horizontal" role="form" enctype="multipart/form-data">
<div class="col-md-12">
<div class="form-group">
<label class="col-sm-3 control-label no-padding-right">文件域:</label>
<div class="col-sm-9">
<input type="file" id="tp" name="file" />
</div>
<br>
<input type="submit" value="点击上传">
</div>
</div>
</form>
4.controller部分代码,获取文件和文件名称,对文件名称进行处理(添加时间戳防止重名)之后,保存在本机的E盘下,结束并跳转到成功页面 upload_success.jsp并打印成功信息
/**
* 上传文件
* */
@RequestMapping(value="/uploadtest")
public String uploadtest(@RequestParam("file")MultipartFile multipartFile, Model model){//入参代表上传的文件
//0,判断是否为空
if(multipartFile!=null && !multipartFile.isEmpty())
{
/**
* 对文件名进行操作防止文件重名
*/
//1,获取原始文件名
String originalFilename = multipartFile.getOriginalFilename();
//2,截取源文件的文件名前缀,不带后缀
String fileNamePrefix = originalFilename.substring(0,originalFilename.lastIndexOf("."));
//3,加工处理文件名,原文件加上时间戳
String newFileNamePrefix = fileNamePrefix + System.currentTimeMillis();
//4,得到新文件名
String newFileName = newFileNamePrefix + originalFilename.substring(originalFilename.lastIndexOf("."));
//5,构建文件对象
File file = new File(upLoadPath + newFileName);
//6,执行上传操作
try {
multipartFile.transferTo(file);
//上传成功,向jsp页面发送成功信息
model.addAttribute("fileName","文件上传成功! 文件名:"+newFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
return "system/plansubmit/upload_success";
}
如上,已经完成了对单个文件上传的操作,控制台已经能打印出文件的名称(处理后)并保存文件到指定的E盘根目录下
对于多个文件,只需要修改前端代码(多个文件input)+controller 即可。
JSP页面:
<form action="/plan/uploadtest2" method="post" class="form-horizontal" role="form" enctype="multipart/form-data">
<div class="col-md-12">
<div class="form-group">
<label class="col-sm-3 control-label no-padding-right">文件域:</label>
<div class="col-sm-9">
<input type="file" name="file" />
<input type="file" name="file" />
</div>
<br>
<input type="submit" value="点击上传">
</div>
</div>
</form>
即多个name为file的input,不需要给多个name命名,后台使用Multipart[] 这个数组接收即可
Controller代码如下:
@RequestMapping(value="/uploadtest2")
public String uploadtest2(@RequestParam("file")MultipartFile[] multipartFiles,Model model){//入参代表上传的文件
//设置list存放数组
List<String> fileNames = new ArrayList<>();
//0,判断是否为空
if(multipartFiles!=null && multipartFiles.length>0)
{
for (MultipartFile multipartFile:multipartFiles)
{
if(multipartFile!=null && !multipartFile.isEmpty())
{
/**
* 对文件名进行操作防止文件重名
*/
//1,获取原始文件名
String originalFilename = multipartFile.getOriginalFilename();
//2,截取源文件的文件名前缀,不带后缀
String fileNamePrefix = originalFilename.substring(0,originalFilename.lastIndexOf("."));
//3,加工处理文件名,原文件加上时间戳
String newFileNamePrefix = fileNamePrefix + System.currentTimeMillis();
//4,得到新文件名
String newFileName = newFileNamePrefix + originalFilename.substring(originalFilename.lastIndexOf("."));
//5,构建文件对象
File file = new File(upLoadPath + newFileName);
//6,执行上传操作
try {
multipartFile.transferTo(file);
//上传成功,把 文件名 存入list里面
fileNames.add(newFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//list传送到前端
model.addAttribute("fileNames",fileNames);
return "system/plansubmit/upload2_success";
}
设置List存放多个文件的名字,循环内部对每个文件进行文件名处理并输出
如上,已经完成了对多个文件上传的操作,文件已经保存到到指定的E盘根目录下。