Java后端通过使用MultipartFile接受前端上传的视频并将其存放在工程中static文件夹下
(好久没有更新博文了,最近在项目中遇到的一个小问题来更新下)
这里只介绍如何项目中我的问题如何解决,MultipartFile的详细使用,网上已经有许多大牛的优秀文章了,我就不班门弄斧了。
因为项目用的springboot+thymeleaf写的,所以MultipartFile照理说同样也适合其他的java项目。
引用百度知道上对MultipartFile的解释:
MultipartFile是spring的一个接口,通常我们可以在controller定义方法使用MultipartFile接收form表单提交的文件,然后将MultipartFile可以转化成一个文件。
这个接口通常是用来接收上传的文件,要将文件转换成MultipartFile文件,那么实际上应该考虑的是将File转换成CommonsMultipartFile。
一、首先贴出前端的上传视频文件html代码:
<form action="#" class="layui-form form form-horizontal" id="form-patient-add"
th:action="@{/admin/patient/add}" enctype="multipart/form-data" method="post">
<div class="layui-form-item">
<label class="layui-form-label"><span class="x-red">*</span>模拟视频:</label>
<input type="file" name="file" id="file"/>
</div>
<button class="layui-btn" id="subbtn" type="submit">
提交
</button>
</form>
在前端代码中有三个比较重要的点:
1、form表单上的enctype=“multipart/form-data”
enctype就是encodetype(编码类型),这个是控制form中数据的编码类型的,默认是application/x-www-form-urlencoded,但是它不能用于文件上传所以我们需要将其改为enctype=“multipart/form-data”
enctype属性总共有三个:
此处引用w3school中的一张截图
2、method=“post”
上传文件的form中method方法必须为post
3、input中的name属性值“file”
name属性值即后端Controller层方法识别的数据名,我这里是“file”。
二、后端Controller层的代码
@PostMapping("add")
@ResponseBody
public AjaxResult add( @RequestParam( value="file",required=false) MultipartFile multipartFile, HttpServletRequest request) {
//视频上传
//获取原文件名
String name=multipartFile.getOriginalFilename();
//获取文件后缀
String subffix=name.substring(name.lastIndexOf(".")+1,name.length());
//控制格式
if(subffix.equals("")||!subffix.equals("mp4")||!subffix.equals("mov")||!subffix.equals("avi")||!subffix.equals("wmv")||!subffix.equals("m4v")||!subffix.equals("dat")||!subffix.equals("flv")||!subffix.equals("mkv"))
{
return AjaxResult.error("视频格式不对");
}
//新的文件名以日期命名
String fileName=new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
//获取项目路径到webapp
String filepath=request.getServletContext().getRealPath("/")+"files\\";
//获取项目根路径并转到static/videos
String path = ClassUtils.getDefaultClassLoader().getResource("").getPath()+"static/videos/";
File file=new File(path);
if(!file.exists())//文件夹不存在就创建
{
file.mkdirs();
}
//保存文件
try {
multipartFile.transferTo(new File(file+"\\"+fileName+"."+subffix));
} catch (IOException e) {
e.printStackTrace();
}
String realPath=file+"\\"+fileName+"."+subffix;
String simulationVideo="/videos/"+fileName+"."+subffix;
return toAjax(true);
}
在add方法参数中
@RequestParam( value=“file”,required=false) MultipartFile multipartFile
value=“file”即接收name值为“file”的input数据,而required=false必须加上,否则会报错导致文件保存不了,具体错误这里就不贴上来了。
代码中的filepath变量和path:
filepath是获取到webapp的路径,
path是获取static文件夹的路径,
这两个均可自定义,最后使用
multipartFile.transferTo(new File(file+"\\"+fileName+"."+subffix));
即可将文件流保存到指定的地方。