ant-design-vue中upload上传图片、视频实现预览功能

这篇具有很好参考价值的文章主要介绍了ant-design-vue中upload上传图片、视频实现预览功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有没有小伙伴在使用ant-design-vue的upload组件时,发现api文档在图片预览功能的介绍寥寥无几,而且也没提供视频预览的demo,在实际开发中碰到相应的需求直挠头~~~~,别急,下面来给大家分享一个我自己封装的upload组件,符合需求可以直接在项目中放到组件目录调用。

template部分代码:

 

<template>
  <div>
    <a-upload
      name="file"
      :multiple="true"
      :action="uploadAction"
      list-type="picture-card"
      :headers="headers"
      :data="{'isup':1,'bizPath':bizPath}"
      :fileList="fileList"
      :beforeUpload="beforeUpload"
      @preview="handlePreview"
      @change="handleChange"
      :disabled="disabled">
        <div v-if="fileList.length < 8">
          <a-icon type="plus" />
          <div class="ant-upload-text">
            上传
          </div>
        </div>
    </a-upload>
    <a-modal v-if="fileType == 'image'" :visible="previewVisible" width="1400px" :footer="null" @cancel="handleImgCancel">
      <img  alt="example" style="width: 100%" :src="previewSrc" />
    </a-modal>
    <a-modal v-if="fileType == 'video/mp4'" :visible="previewVisible" :footer="null" @cancel="handleVideoCancel">     
      <video alt="example" style="width: 100%" :src="previewSrc" controls>
      </video>
    </a-modal>
  </div>
</template>

script部分代码:

<script>
  import Vue from 'vue'
  import { ACCESS_TOKEN } from "@/store/mutation-types"
  const FILE_TYPE_ALL = "all"
  const FILE_TYPE_IMG = "image"
  const FILE_TYPE_MP4 = "video/mp4"
  const FILE_TYPE_TXT = "file"
  const uidGenerator=()=>{
    return '-'+parseInt(Math.random()*10000+1,10);
  }
  const getFileName=(path)=>{
    if(path.lastIndexOf("\\")>=0){
      let reg=new RegExp("\\\\","g");
      path = path.replace(reg,"/");
    }
    return path.substring(path.lastIndexOf("/")+1);
  }
  export default {
    name: 'JUpload',
    data(){
      return {
        uploadAction:window._CONFIG['domianURL']+"/sys/common/upload",//图片上传地址
        imgErver: window._CONFIG['domianURL'] + '/sys/common/view',//图片预览地址
        videoErver: window._CONFIG['domianURL'] + 'sys/common/view_video',//视频预览地址
        isCreatFile:true,//是否创建文件占位dom
        headers:{},
        fileList: [],
        previewSrc:'',
        previewVisible:false,
      }
    },
    props:{
      text:{
        type:String,
        required:false,
        default:"点击上传"
      },
      fileType:{
        type:String,
        required:false,
        default:FILE_TYPE_ALL
      },
      /*这个属性用于控制文件上传的业务路径*/
      bizPath:{
        type:String,
        required:false,
        default:"temp"
      },
      value:{
        type:[String,Array],
        required:false
      },
      // update-begin- --- author:wangshuai ------ date:20190929 ---- for:Jupload组件增加是否能够点击
      disabled:{
        type:Boolean,
        required:false,
        default: false
      },
    },
    watch:{
      value(val){
        console.log(val)
        if (val instanceof Array) {
          this.initFileList(val.join(','))
        } else {
          this.initFileList(val)
        }
      }
    },
    created(){
      const token = Vue.ls.get(ACCESS_TOKEN);
      this.headers = {"X-Access-Token":token}
    },

    methods:{
      initFileList(paths){
        if(!paths || paths.length==0){
          //return [];
          // update-begin- --- author:os_chengtgen ------ date:20190729 ---- for:issues:326,Jupload组件初始化bug
          this.fileList = [];
          return;
          // update-end- --- author:os_chengtgen ------ date:20190729 ---- for:issues:326,Jupload组件初始化bug
        }
        let fileList = [];
        let arr = paths.split(",")
        for(var a=0;a<arr.length;a++){
          fileList.push({
            uid:uidGenerator(),
            name:getFileName(arr[a]),
            status: 'done',
            url: this.urlDownload+arr[a],
            response:{
              status:"history",
              message:arr[a]
            }
          })
        }
        this.fileList = fileList
      },
      handlePathChange(){
        let uploadFiles = this.fileList
        let path = ''
        if(!uploadFiles || uploadFiles.length==0){
          path = ''
        }
        let arr = [];

        for(var a=0;a<uploadFiles.length;a++){
          if(uploadFiles[a].response){
            arr.push(uploadFiles[a].response.message)
          }      
        }
        if(arr.length>0){
          path = arr.join(",")
        }
        this.$emit('change', path);
      },
      beforeUpload(file){//上传文件前对文件类型判断
        var fileType = file.type;
        if(this.fileType === FILE_TYPE_ALL){        
          this.isCreatFile = true;
          return true;
        }
        else if(fileType === this.fileType){
          this.isCreatFile = true;
          return true;
        }
        else{
          if(this.fileType === FILE_TYPE_IMG){
            if(fileType.indexOf('image')<0){
              this.$message.warning('请上传图片');
              this.isCreatFile = false;
              return false;
            }
          }else if(this.fileType === FILE_TYPE_TXT){
            if(fileType.indexOf('image')>=0){
              this.$message.warning('请上传文件');
              this.isCreatFile = false;
              return false;
            }
          }
          else if(this.fileType === FILE_TYPE_MP4){
            if(fileType.indexOf('mp4')<0){
              this.$message.warning('请上传mp4文件');
              this.isCreatFile = false;
              return false;
            }
          }
        }
        //TODO 扩展功能验证文件大小
      },
      handleChange(info) {
        if(this.isCreatFile == false){
          return false
        }
        let fileList = info.fileList
        if(info.file.status==='done'){
          if(info.file.response.success){
            fileList = fileList.map((file) => {
              if (file.response) {
                file.url = this.urlDownload+file.response.message;
              }
              return file;
            });
          }
          this.$message.success(`${info.file.name} 上传成功!`);
        }else if (info.file.status === 'error') {
          this.$message.error(`${info.file.name} 上传失败.`);
        }else if(info.file.status === 'removed'){
          this.handleDelete(info.file)
        }
        this.fileList = fileList
        if(info.file.status==='done' || info.file.status === 'removed'){
          this.handlePathChange()
        }
      },
      handleImgCancel() {
        this.previewVisible = false;
      },
      handleVideoCancel(){
        this.previewVisible = false;
        let myVideo = document.getElementsByTagName('video');
        let arr = Array.from(myVideo)
        arr.forEach(item =>{//关闭时暂停播放
          item.pause()
        })
      },
      async handlePreview(file) {//判断打开不同文件预览窗口
        if(this.fileType == 'image'){
          if (!file.url && !file.preview) {
            file.preview = await getBase64(file.originFileObj);
          }
          this.previewSrc = file.url || file.preview;
          this.previewVisible = true;
        }
        if(this.fileType == 'video/mp4'){
          this.previewSrc = this.imgErver + '/' + file.response.message;
          this.previewVisible = true;
        }
      },
      handleDelete(file){
        //如有需要新增 删除逻辑
        console.log(file)
      },
    },
    model: {
      prop: 'value',
      event: 'change'
    }
  }
</script>

好人做到底,组件调用也贴上:

<JUpload @change="saveImageUrl" ref="imgUpload" :fileType="'image'" :value="savedImageList"></JUpload>

最后要注意的地方:

antd 视频上传vue,组件封装,anti-design-vue,前端

 如果需要多次上传,记得在重置组件文件列表,不然会有缓存文章来源地址https://www.toymoban.com/news/detail-523204.html

到了这里,关于ant-design-vue中upload上传图片、视频实现预览功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于 ant-design-vue resetFields 失效

    关于 ant-design-vue resetFields 失效 背景: 遇到这样的问题使用 ant-design-vue useForm 来制作表单的时候, resetFields()失效 场景: 编辑 -赋值 新增 -初始值(问题点:新增的时候他就不 初始化 ) 方案: 1、调用 resetFields() 传参 2、要么使用 reactive 明确定义初始值 解释: 首先我这里讲

    2024年01月17日
    浏览(34)
  • Ant Design upload 文件上传 限制文件只能上传一个

    上传前:                 回显:可以删除   最近做了一个后台管理系统使用的是 Ant Design和vue框架搭建的 文件上传 :组件:  Ant Design   https://1x.antdv.com/components/upload-cn/  (upload 官方文档) 功能需求 : 1.可以拖拽,或者点击上传文件  2.只能上传单个文件,不能上传多个文

    2024年02月14日
    浏览(34)
  • ant-design-vue 自由切换 暗黑模式dark

    思路 引入 dark.css 文件 动态切换 prefixCls 实现效果 我们来看看官网怎么说的 官网地址 除了 less 定制主题 外,我们还提供了 CSS Variable 版本以支持动态切换主题能力。你可以在 ConfigProvider 进行体验。 调用 ConfigProvider 配置方法设置主题色: 默认情况下,CSS Variable 会以 --ant 作

    2023年04月21日
    浏览(37)
  • 国际化配置(ant-design-vue设置成中文)

    vue3 + ts + ant-design-vue 引用ant-design-vue的组件时,默认是英文的。 官网说明:https://www.antdv.com/components/date-picker-cn   我用的全局设置。在项目的App.vue文件里引入ant-design-vue自带的zh_CN,用a-config-provider 将RouterView包裹起来。但是我发现设置了全局,在使用日期选择框时还是英文,

    2024年02月22日
    浏览(41)
  • ant-design-vue表格Table行内新增、编辑、删除

    ant-design-vue表格Table进行单元格内新增、编辑、删除等操作 如图所示:

    2024年02月14日
    浏览(34)
  • ant-design-vue 4.x升级问题-样式丢失问题

    该文档是在升级ant-design-vue到4.x版本的时候遇到的问题 以上是开发项目时使用的包以及包的版本,使用的脚手架是vite 当使用ant-design-vue3.x版本时没有任何问题,但是当升级ant-design-vue到4.0版本时,因为ant-design-vue4.x使用了css-in-js需要修改vite.config.js配置 变更为 修改后当开发环

    2024年02月14日
    浏览(29)
  • [ant-design-vue] table组件列宽拖拽功能

    原有的样式文件没有使用的必要,个人添加的部分样式内容就符合需求了 vue3.x对应的ant-design-vue中的table组件本身支持列宽的拖动了,不需求额外的包的支持,根据Api说明设置resizeColumn即可

    2024年01月23日
    浏览(41)
  • Ant-design-vue AutoComplete 自动补全组件的使用

    AutoComplete 是一个输入框自动完成功能,在输入时提个建议或者辅助提示。 和 Select 的区别是: AutoComplete 是一个带提示的文本输入框,用户可以自由输入,是辅助输入 Select 是在限定的可选项中进行选择,是选择。 使用案例如下: filterOption 是否根据输入项进行

    2024年02月12日
    浏览(33)
  • vue2安装ant-design UI报错 ERR! peer vue@“>=3.2.0“ from ant-design-vue@3.2.15

    npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: default@0.1.0 npm ERR! Found: vue@2.7.14 npm ERR!   vue@\\\"^2.6.10\\\" from the root project npm ERR! npm ERR! Could not resolve dependency: npm ERR! peer vue@\\\"=3.2.0\\\" from ant-design-vue@3.2.15 npm ERR! node_modules/ant-design-vue npm ERR!   ant-design

    2024年02月01日
    浏览(45)
  • ant-design-vue的table表格行合并和列合并

    场景说明: 1、列合并:需要在表格最后一列进行合并,如图: 思路:相当于是第二列的最后一栏(colSpan )占比5列,第2列后面的4列最后一行(colSpan )占比0。 代码示例 行合并需求如图:将指定列的多行合并成一行 思路:和合并列差不多;第一列的第一行和第二行要合并

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包