开发喵星球

若依分离版视频上传(189)

一、前端部分

1、视频上传组件

<el-upload class="avatar-uploader" id="avatar-uploader" 
            :headers="videoUpload.headers" 
            :drag="videoUpload.Plus"
            :action="videoUpload.uploadUrl" 
            multiple :show-file-list="false" 
            :on-success="handleVideoSuccess"
            :before-upload="beforeUploadVideo" 
            :on-progress="uploadVideoProcess" 
            :disabled="videoUpload.isDisabled">

            <i v-if="videoUpload.Plus" class="el-icon-upload"></i>
            <div v-if="videoUpload.Plus" class="el-upload__text">
              将文件拖到此处,或<em>点击上传</em>
            </div>
            <el-progress v-if="videoFlag == true" type="circle"                         
              :percentage="videoUpload.videoUploadPercent"
              style="margin-top: 30px"></el-progress>
            <div class="el-upload__tip" slot="tip" v-if="videoUpload.Plus">
              只能上传mp4/flv/avi文件,且不超过5000M
            </div>

          //自己写了一个关闭按钮
         <button v-if="videoUpload.videoForm.videoUrl !== ''" id="closeBtn"
              @click.prevent.stop="handleRemove1">关闭</button>

          <div class="avatar-icon-box" v-if="videoUpload.videoForm.videoUrl !== ''">
              <img v-if="form.lzglXcglXcwtsp == ''" class="avatar-icon imgess"
                style="align-items: center; vertical-align: middle" />

              <video v-else-if="form.lzglXcglXcwtsp !== ''" 
                v-bind:src="form.lzglXcglXcwtsp" class="video-avatar"
                :autoplay="false" controls="controls" muted></video>
          </div>
</el-upload>

2、js部分

const videoUpload = reactive({
  // 设置上传的请求头部
  headers: { Authorization: "Bearer " + getToken() },
  // 上传的地址
  uploadUrl: import.meta.env.VITE_APP_BASE_API + "服务器地址",
  videoFlag: false,
  Plus: true,
  isDisabled: false,

  //上传视频时带的参数,这个地址就是后端保存磁盘的地址。可以更改。

  //视频部分
  videoForm: {
    videoId: '',
    videoUrl: '',
    videoUrl1: ''
  },
  videoUploadPercent: 0

})

// 视频上传前执行
function beforeUploadVideo(file) {
  //文件大小
  const isLt300M = file.size / 1024 / 1024 < 5000
  //视频后缀检查
  if (['video/mp4', 'video/ogg', 'video/flv', 'video/avi', 'video/wmv', 'video/rmvb'].indexOf(file.type) === -1) {
    proxy.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>请上传正确的视频格式</div>", { dangerouslyUseHTMLString: true });
    return false
  }
  if (!isLt300M) {
    proxy.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>上传视频大小不能超过5000MB哦</div>", { dangerouslyUseHTMLString: true });
    return false
  }
}
// 视频上传过程中执行
function uploadVideoProcess(event, file, fileList) {
  //videoUpload.Plus = false
  videoUpload.videoFlag = true
  videoUpload.videoUploadPercent = + file.percentage.toFixed(0)
  //console.log(file);
}

// 视频上传成功是执行
function handleVideoSuccess(res, file) {
  //videoUpload.Plus = false
  videoUpload.videoUploadPercent = 100
  // 如果为200代表视频保存成功
  if (res.resCode === '200') {
    // 接收视频传回来的名称和保存地址
    // 至于怎么使用看你啦~
    videoUpload.videoForm.videoId = res.newVidoeName
    videoUpload.videoForm.videoUrl = res.VideoUrl

    form.value.lzglXcglXcwtsp = res.VideoUrl

  } else {
    //this.message.error('视频上传失败,请重新上传!')
    proxy.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>视频上传失败,请重新上传!</div>", { dangerouslyUseHTMLString: true });
  }
}

function handleRemove1() {
  videoUpload.isDisabled = true
  proxy.modal.confirm("确定移除视频?").then(function () {
    loading.value = true;
  }).then(() => {
    form.value.lzglXcglXcwtsp = ''
    videoUpload.videoForm.videoUrl = ''
    videoUpload.isDisabled = false
    proxy.modal.msgSuccess("移除成功");
  }).catch(() => {
  }).finally(() => {
    loading.value = false;
  });
}

3、css部分

.video-avatar {
  width: 400px;
  height: 250px;
}

.el-icon-circle-close {
  margin-right: 5%;
  color: #0c25e0;
  font-size: 22px;

}

#closeBtn {
  margin-top: 3%;
  margin-left: 85%;
  background-color: red;
  color: white;
  border: none;
  padding: 5px 10px;
  cursor: pointer;
}

二、后端代码

/**
     * 上传视频
     */
    @PostMapping("/upload")
    @ResponseBody
    //Map<String,String>: map是键值对形式组成的集合,类似前端的数组但是里面是键值对形式的,前后两个string代表键和值都是字符串格式的。
    //post请求传入的参数:MultipartFile file(理解为springmvc框架给我们提供的工具类,代表视频流数据),SavePath(前台传来的地址路径,也是用来后端保存在服务器哪个文件夹的地址)
    public Map<String, String> savaVideoTest(@RequestParam("file") MultipartFile file)
    //throws IllegalStateException写在方法的前面是可以抛出异常状态的,如果有错误会把错误信息发出来对应下面的try和catch
        throws IllegalStateException
    {
        //new一个map集合出来
        Map<String, String> resultMap = new HashMap<>();
        try
        {
            log.info("保存开始!");
            //获取文件后缀,因此此后端代码可接收一切文件,上传格式前端限定
            String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1).toLowerCase();
            // 重构文件名称
            //System.out.println("文件保存路径" + SavePath);

            //UUID(全局唯一标识符)randomUUID(随机生成标识符)toString(转成字符串)replaceAll(替换字符方法,因为随机生成的里面包括了 - ,这里意思是把 - 全部换成空)
            String pikId = UUID.randomUUID().toString().replaceAll("-", "");
            //视频名字拼接:唯一标识符加上点,再加上上面的视频后缀也就是MP4之类的。就组成了现在的视频名字,比如这样:c7bbc1f9664947a287d35dd7cdc48a95.mp4
            String newVideoName = pikId + "." + fileExt;
            System.out.println("重构文件名防止上传同名文件:" + newVideoName);
            //保存视频的原始名字
            String videoNameText = file.getOriginalFilename();
            System.out.println("视频原名:" + videoNameText);

            // 上传文件路径
            String filePath = RuoYiConfig.getUploadPath();

            String pathFileName = getPathFileName(filePath, newVideoName);

            String url = serverConfig.getUrl()+pathFileName;

            //判断SavePath这个路径也就是需要保存视频的文件夹是否存在
            File filepath = new File(filePath, file.getOriginalFilename());
            if (!filepath.getParentFile().exists())
            {
                //如果不存在,就创建一个这个路径的文件夹。
                filepath.getParentFile().mkdirs();
            }
            //保存视频:把视频按照前端传来的地址保存进去,还有视频的名字用唯一标识符显示,需要其他的名字可改这
            File fileSave = new File(filePath, newVideoName);
            //下载视频到文件夹中
            file.transferTo(fileSave);
            //构造Map将视频信息返回给前端
            //视频名称重构后的名称:这里put代表添加进map集合内,和前端的push一样。括号内是前面字符串是键,后面是值
            resultMap.put("newVideoName", newVideoName);
            //正确保存视频成功,则设置返回码为200
            resultMap.put("resCode", "200");
            //返回视频保存路径
            resultMap.put("VideoUrl", url);
            //到这里全部保存好了,把整个map集合返给前端
            log.info("保存成功!");
            return resultMap;

        }
        catch (Exception e)
        {
            //在命令行打印异常信息在程序中出错的位置及原因
            e.printStackTrace();
            //返回有关异常的详细描述性消息。
            e.getMessage();
            //保存视频错误则设置返回码为400
            resultMap.put("resCode", "400");
            //这时候错误了,map里面就添加了错误的状态码400并返回给前端看
            return resultMap;

        }
    }

private static final String getPathFileName(String uploadDir, String fileName) throws IOException
    {
        int dirLastIndex = RuoYiConfig.getProfile().length() + 1;
        String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
        String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
        return pathFileName;
    }

将组件放在你所需要的地方即可

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-04-23 19:59:45 阅读量:152
<<   >>


powered by kaifamiao