上传视频和图片

<template>
  <a-modal
    v-if="videoSrc"
    :open="videoVisible"
    :title="videoTitle"
    :footer="null"
    @cancel="handleVideoCancel"
  >
    <video
      width="100%"
      height="300px"
      controls
      ref="myvideo"
      :src="videoSrc"
    ></video>
  </a-modal>
  <a-modal
    v-if="previewImage"
    :open="previewVisible"
    :title="previewTitle"
    :footer="null"
    @cancel="handleCancel"
  >
    <img alt="example" style="width: 100%" :src="previewImage" />
  </a-modal>
  <a-upload
    v-if="isShow === 2"
    v-model:file-list="fileList"
    :multiple="true"
    name="file"
    action="/simon-ai/web/file/upload/file"
    :headers="{
      token: memberStore.token,
    }"
    :before-upload="beforeUpload"
    list-type="picture"
    :previewFile="previewFile"
    @preview="handlePreview"
    @change="handleChange"
  >
    <a-button type="primary">点击上传</a-button>
  </a-upload>
</template>

<script setup lang="ts">
import { ref, watchEffect } from "vue";
import type { UploadProps } from "ant-design-vue";
import { message } from "ant-design-vue";
import useMemberStore from "@/stores/member";
const memberStore = useMemberStore();
defineProps({
  isShow: Number,
});
const fileList = ref<UploadProps["fileList"]>([]);
const videoSrc = ref();
const myvideo = ref();
function getBase64(file: File) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = (error) => reject(error);
  });
}
const beforeUpload = (file: any) => {
  // MP4, MOV, AVI, FLV, MKV, JPG, JPEG, PNG, MPEG4
  const isJpgOrPng =
    file.type === "image/jpeg" ||
    file.type === "image/png" ||
    file.type === "image/jpg" ||
    file.type === "video/mp4" ||
    file.type === "video/mov" ||
    file.type === "video/avi" ||
    file.type === "video/flv" ||
    file.type === "video/mkv" ||
    file.type === "video/mpeg4";
  if (!isJpgOrPng) {
    message.error("上传文件的格式不正确");
  }
  const isLt200M = file.size / 1024 / 1024 < 200;
  if (!isLt200M) {
    message.error("文件大小不能超过200M");
  }
  return isLt200M && isJpgOrPng;
};

// 图片.视频预览
const previewVisible = ref(false);
const previewImage = ref("");
const previewTitle = ref("");
// 视频
const videoVisible = ref(false);
const videoTitle = ref("");
const handleCancel = () => {
  previewVisible.value = false;
  previewTitle.value = "";
};
const handleVideoCancel = () => {
  videoVisible.value = false;
  videoTitle.value = "";
};
watchEffect(() => {
  if (videoVisible.value === false) {
    myvideo.value?.pause();
  }
});
const handlePreview = async (file: any) => {
  if (!file.url && !file.preview) {
    file.preview = (await getBase64(file.originFileObj)) as string;
  }
  if (
    file.type === "image/jpeg" ||
    file.type === "image/png" ||
    file.type === "image/jpg"
  ) {
    previewVisible.value = true;
    previewTitle.value =
      file.name || file.url.substring(file.url.lastIndexOf("/") + 1);
    previewImage.value = file.url || file.preview;
  }
  if (
    file.type === "video/mp4" ||
    file.type === "video/mov" ||
    file.type === "video/avi" ||
    file.type === "video/flv" ||
    file.type === "video/mkv" ||
    file.type === "video/mpeg4"
  ) {
    const current = file.originFileObj;
    const fileReader = new FileReader();
    fileReader.readAsDataURL(current);
    fileReader.onload = function (e) {
      videoSrc.value = e.target?.result;
      videoVisible.value = true;
      videoTitle.value =
        file.name || file.url!.substring(file.url!.lastIndexOf("/") + 1);
    };
  }
};

// 预览
const handleChange = async (info: any) => {
  if (info.file.status !== "uploading") {
  }
  if (info.file.status === "done") {
    message.success(`${info.file.name} 文件上传成功`);
    console.log(info.file);
  } else if (info.file.status === "error") {
    message.error(`${info.file.name} 文件上传失败.`);
  }
};
defineExpose({
  fileList,
});
const  previewFile = (file: any) => {
  if (file.type === "video/mp4") {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onload = () => resolve(reader.result as string);
      reader.onerror = (error) => reject(error);
    });
  } else {
    return new Promise(async (resolve) => {
      const img = await getBase64(file);
      resolve(img);
    });
  }
};
</script>

<style scoped></style>

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值