Vue Element ui Upload组件在上传文件时,动态切换 action上传路径

当我们在使用 Element ui,Upload组件时,官网默认的基础配置如下

<el-upload
  class="avatar-uploader"
  action="https://jsonplaceholder.typicode.com/posts/"  //这里目前是写死的上传路径
  :show-file-list="false"  //上传文件列表
  :on-success="handleAvatarSuccess"  //上传成功后的回调函数
  :before-upload="beforeAvatarUpload">  //上传文件之前的的回调函数
   <el-button size="small" type="primary">点击上传</el-button>
</el-upload>

现在的需求是,如果页面只有 一个 el-upload组件,需要上传的文件,根据不同的类型,切换不同的action 上传路径。

首先我这里选择,通过调用 before-upload 上传文件之前的钩子函数,函数接收一个参数,就是上传的文件信息,然后判断文件的类型,如果上传的是视频文件,那么就,动态重写 action 的上传路径,如果是图片或者音频,同样的动态写入相应的上传路径。

官网中,对上传文件之前的钩子函数,官网这里的描述,可能会让大家产生误导(官网没错,只是有的小伙伴理解错了)。结合描述查看下面有问题的错误写法。
在这里插入图片描述

错误写法:

<el-upload
  class="avatar-uploader"
  :action="AudioAndVideoPath"  //现在这里动态绑定地址参数
  :show-file-list="false"  //上传文件列表
  :on-success="handleAvatarSuccess"  //上传成功后的回调函数
  :before-upload="beforeAvatarUpload">  //上传文件之前的的回调函数
   <el-button size="small" type="primary">点击上传</el-button>
</el-upload>

<script>
import { url } from '../../../api/Globaladdress/index'; //我这里导入全局地址总路径
export default {
 data() {
    return {
        url,   //全局地址
        AudioAndVideoPath: ``  //音视频上传动态路径
    }
 },
methods:{
 beforeAvatarUpload(file) {   //上传文件之前的函数
      console.log(file);   //接收上传的文件信息
      const isvideo = file.type === 'video/mp4';  //视频格式,查看上传的文件是不是视频或者音频文件格式,拿到一个Booleans 值
      const isaudio = file.type === 'audio/mpeg';  //音频格式
      if (isvideo) {  //判断如果isvideo等于true,代表,满足要求是视频格式。
             this.AudioAndVideoPath = this.url + "/upload/fileVideo";  //我这里采用字符串拼接,动态重写文件上传路径,这里的路径是专门上传视频的。
             return isvideo ;//(官网描述:如果返回false,就终止上传,那么这里,isvideo 能够进到if判断,就肯定为 true,按官网描述推理,如果返回true,就不会终止上传)
      } else if (isaudio) {  //判断是否满足音频格式,如果满足,动态重写,上传音频时的路径
           this.AudioAndVideoPath = this.url + "/upload/fileAudio";
           return isaudio ;//(上面描述同理)
       } else {   //如果上传文件不满足规定格式,再返回 false ,并提示,终止上传,不用配置上传路径。
            this.$message({
               message: '上传格式不准确!请上传视频或音频格式文件',
                  type: 'warning',
                  duration: 6000
                });
                return false ;//都不满足,再返回false终止上传。
            }
       },
       handleAvatarSuccess(response, file, fileList){   //上传成功后的回调函数(错误写法这里这里不会执行)
             console.log(response, file, fileList);
       }
    }
}
</script>

上述错误写法,会造成,跨域或重定向问题,错误代码404,因为上述错误写法,在我的 beforeAvatarUpload 钩子函数还没,执行的时候 ,Upload 组件中 action 路径方法已经调用了,而这时候,action 的动态路径还没有定义,所以,他会提示找不到路径,可能会导航到当前页面的本地地址,然后报错404。
在这里插入图片描述

正确写法如下:首先把 action动态绑定

<el-upload
  class="avatar-uploader"
  :action="AudioAndVideoPath"  //现在这里动态绑定地址参数
  :show-file-list="false"  //上传文件列表
  :on-success="handleAvatarSuccess"  //上传成功后的回调函数
  :before-upload="beforeAvatarUpload">  //上传文件之前的的回调函数
   <el-button size="small" type="primary">点击上传</el-button>
</el-upload>

<script>
import { url } from '../../../api/Globaladdress/index' ;//我这里导入全局地址总路径
export default {
 data() {
    return {
        url,   //全局地址
        AudioAndVideoPath: ``  //音视频上传动态路径
    }
 },
methods:{
 beforeAvatarUpload(file) {   //上传文件之前的函数
      console.log(file);   //接收上传的文件信息
      const isvideo = file.type === 'video/mp4';  //视频格式,查看上传的文件是不是视频或者音频文件格式,拿到一个Booleans 值
      const isaudio = file.type === 'audio/mpeg';  //音频格式
      if (isvideo) {  //判断如果isvideo等于true,代表,满足要求是视频格式,返回一个 Promise 对象
         return new Promise((resolve) => {
             this.$nextTick(() => {
             this.AudioAndVideoPath = this.url + "/upload/fileVideo";  //我这里采用字符串拼接,动态重写文件上传路径,这里的路径是专门上传视频的。
               resolve();
             })
         })
      } else if (isaudio) {  //判断是否满足音频格式,如果满足,动态重写,上传音频时的路径
           return new Promise((resolve) => {
               this.$nextTick(() => {
                  this.AudioAndVideoPath = this.url + "/upload/fileAudio";
                    resolve();
               })
           })
       } else {   //如果上传文件不满足规定格式,则返回 false ,并提示,终止上传,不用配置上传路径。
            this.$message({
               message: '上传格式不准确!请上传视频或音频格式文件',
                  type: 'warning',
                  duration: 6000
                });
                return false;
            }
       },
       handleAvatarSuccess(response, file, fileList){   //上传成功后的回调函数
             console.log(response, file, fileList);
       }
    }
}
</script>

上面就是我遇到的问题,以及解决方法,供大家参考。

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧梦星轨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值