类似抖音的短视频管理系统+Java后端+vue前端(7)
实现视频上传功能
前端
开启工具栏
编写头工具栏事件
//头工具栏事件
table.on('toolbar(videoTable)', function(obj){
var checkStatus = table.checkStatus(obj.config.id);
switch(obj.event){
case 'add':
layer.msg('添加');
break;
case 'delete':
layer.msg('删除');
break;
case 'daoru':
layer.msg('编辑');
break;
};
});
注意:
- toolbar(videoTable)中的videoTable指的是DataTable.html页面中的
<table>
标签的lay-filter
属性 - 下方的三个值指的是DataTable.html页面中的按钮事件
<a>
标签的lay-event
属性
实现点击添加按钮跳出视频添加页面
case 'add':
layer.msg('添加');
//打开一个新的窗口,添加视频操作
var layer = layui.layer;
layer.open({
type:2, //iframe可以直接引入一个页面
title:"添加视频",
shade:0.5, //窗口的外部阴影配置
shareClose:true, //点击外部窗口消失
area:["60%","60%"],
content:"/templates/addvideo.html"
})
break;
上传文件工具类
视频文件的上传mydata.js
//视频上传
upload.render({
elem: '#choosevideo' //绑定选择文件的按钮
,url: '/videos/upload/' // 上传视频的路径
,auto: false //选择文件后不自动上传
,accept:'file'
,size:500000
,bindAction: '#sure' //指向一个按钮触发上传
,choose: function(obj){
//将每次选择的文件追加到文件队列
var files = obj.pushFile();
//预读本地文件,如果是多文件,则会遍历。(不支持ie8/9)
obj.preview(function(index, file, result){
console.log(index); //得到文件的名称
var filename =file.name;
//把文件名称写入到输入框里
$("#video_url").val(filename)
});
}
});
视频上传完成弹出窗口
//上传完毕弹出一个小窗口
,done: function(res, index, upload){
if (res.message == "ok"){
layer.msg("上传完毕 ")
}
},
error:function (res) {
layer.msg(res.message)
//关闭弹窗
layer.closeAll()
}
上传页面addvideo.html
<body>
<form class="layui-form" action="" lay-filter="example" id="form">
<div class="layui-form-item">
<label class="layui-form-label">视频</label>
<div class="layui-input-block">
<input type="text" id="video_url" name="videoPath" class="layui-input layui-disabled"
placeholder="视频名称(只支持mp4)"/>
<!--//上传按钮-->
<button type="button" class="layui-btn" id="choosevideo">选择视频</button>
<button type="button" class="layui-btn" id="sure">确定</button>
</br>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">视频描述</label>
<div class="layui-input-block">
<input type="text" name="videoDesc" autocomplete="off" placeholder="请输入视频描述" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="sub" id="submit">立即上传</button>
</div>
</div>
</form>
<script src="../layui/layui.js"></script>
<script src="../js/mydata.js"></script>
</body>
后端
videocontroller
//视频上传
@RequestMapping("upload")
@ResponseBody
public Result upload(MultipartFile file, HttpServletRequest request){
Result result = new Result();
//输出到后台的文件名
String filename = file.getOriginalFilename();
System.out.println(filename);
try {
UpUtils.upfile(file,request);
result.setMessage("ok");
}catch (Exception e){
e.printStackTrace();
result.setMessage("error");
}
return result;
}
UpUtils工具类
public class UpUtils {
//静态的方法,通过类名直接调用方法
public static void upfile(MultipartFile file, HttpServletRequest request) {
//获取当前的路径----war包下的WEB-INF/video/路径
String realPath = request.getServletContext().getRealPath("/WEB-INF/video/");
System.out.println("realpath:" + realPath);
// 开发代码的web-INF/video的路径:
String basePath = "D:\\JetBrains\\project\\tiktok-project\\src\\main\\webapp\\WEB-INF\\video";
// 将参数里的 file写入到两个文件当中
//写入到war包的路径
File file1 = new File(realPath);
//写入到开发代码的文件路径当中
File file2 = new File(basePath);
//判断两个文件夹是否存在
if (!file1.exists()) {
file1.mkdirs();
}
if (!file2.exists()) {
file2.mkdirs();
}
//获取当前的文件名
String orgName = file.getOriginalFilename();
try {
//用输出流开始拷贝文件
// 参数1 拷贝文件的路径+文件名,参数2是否在文件的末尾追加内容
FileOutputStream fos1 = new FileOutputStream(realPath + orgName, false);
FileOutputStream fos2 = new FileOutputStream(basePath + orgName, false);
// file类型是 MultipartFile类型,可以转化为字节数组
fos1.write(file.getBytes());
fos2.write(file.getBytes());
/* long bs=new Date().getTime();
UUID.randomUUID().toString();*/
// 刷新缓存,把缓存内容,刷到文件当中
fos1.flush();
fos2.flush();
if (fos1 != null) {
fos1.close();
}
if (fos2 != null) {
fos2.close();
}
} catch (Exception e) {
}
}
}
**注意:**这两个路径要改成自己的