使用element-ui的upload组件上传代码包时遇到的问题小结

1.在工作中使用element-ui的upload组件时,遇到一个问题就是这个upload会自动发送一个http请求,即使你使用了http-request自定义上传覆盖默认上传函数,也会导致在控制台里多出一个请求,并且当项目中使用proxy代理挂载到原型上类似的请求接口方法的时候,必须知道原请求路径放在他的actions属性中,才可以使它的多余请求不报错,可能说的有一些混乱,接下来用代码演示:

export function proxy (interfaceId, proxyOptions = {}) {
  return (data = {}, options = {}) => {
    let config = Object.assign({}, proxyOptions, options)
    return app.api.rpc(interfaceId, data, config)
  }
}

2.在项目中使用类似的接口处理函数的时候,此时的actions里面应该填写要请求的服务器地址,但是项目中已经把请求封装且做了统一处理的时候,这个actions就基本不会再去使用它,就算使用也得加上很多环境使用的判断条件,actions的局限性由此体现了出来,但是element-ui的官方又给了http-request的方法可以覆盖默认的上传函数,接下来我们看一下使用http-request的方法来定义这个上传函数会出现什么问题?

   // 自定义上传函数,覆盖默认的上传
    uploadSectionFile(params) {
      console.log(params.file);
      console.log(file);
      this.fileName = file.name;
      // apcremiId 组件库id
      // version 版本号
      // file  压缩包
      this.impProgressPercent = true;
      let i = 1;
      let timer = setInterval(() => {  // 这只是一个动画效果可以忽略
        this.importProgressPercent = i;
        i++;
        if (i == 100) {
          clearInterval(timer);
        }
      }, 10);
      let formData = new FormData();  //定义传向服务器的参数
      formData.append("file", file.raw);
      formData.append("apcremiId", this.apcremiId);
      formData.append("version", this.version);
      formData.append("apcremiCode", this.apcremiCode);
      //接下来是接口请求 // 可以稍微看一下
      this.getRes(formData)
        .then((res) => {
          console.log(res);
          this.handleSuccess();
          let info = {
            packageUrl: res.url,
            packageName: res.packageNm,
            version: res.version,
            idList:res.idList
          };
          this.buildRes(info)
            .then((res) => {
              console.log(res);
              this.expProgressPercent = true;
              let j = 1;
              let timer1 = setInterval(() => {
                this.explainProgressPercent = j;
                j++;
                if (j == 100) {
                  clearInterval(timer1);
                  this.explainStart();
                }
              }, 40);
            })
            .catch((err) => {
              console.log(err);
              this.eError = err.errorMsg
              this.buildError();
            });
        })
        .catch((err) => {
          console.log(err);
          console.log("上传失败");
          this.iError = err.errorMsg
          this.handleError();
        });
    },

3.出现的问题及总结

第一个问题:当传入组件包的时候发现上传文件传了两个接口,这个时候在后端有强校验的情况下,不能重复的传代码包,因为上传代码包解析之后就会入库,而入库的强校验就会抛出错误,前端项目接受后就会弹窗报错,体验极其不好,这个是我粗心的问题,还是得看文档看文档看文档,element-ui的upload组件有一个auto-upload属性默认为true,也就是默认在你选中文件的时候就会调用http-request这个函数,并且就会调用你自己配置的一个上传,导致上传两次报错

第二个问题:可以看出代码中一直链式调用,然后在promise的函数中写上传成功,上传失败和进度条的代码,而element-ui自己的上传成功等函数就会失效,我当时在想,这个可能是个缺陷,当然这个时候得感谢我的组长,一语点醒,当时他说:组件没有问题,你使用的有点问题,在源码中,upload组件内部往我们自定的上传方法中传递了一个options参数,其中包含了对upload上传文件 success 成功函数和error 失败函数,也就是说,其实我们也可以在自定义上传里面主动调用这些钩子以实现相应功能,当然这就是我自己使用的一个方法,可以算是误打误撞了,但是这个方法是有些繁琐。

如何解决这个问题其实非常简单,即添加return 语句返回promise 结果,因为我们大多数的请求都是使用axios,而axios返回的就是promise函数,所以只需要在你调用接口的地方去写一个return去返回他,就不用那么繁琐的去手动调用,有的时候判断多了,找不到自己的函数,让代码内部自己去判断,可以说是物尽其用。

之前的代码可以说减少了一半,阅读起来也看的清楚了,而那些成功或者失败触发相应的操作只需要在成功或者失败回调函数中定义就可以了

这是在网上找到的一个截图,可以发现我们可以通过http-request的自定义方法中的return promise来关联内部的成功,失败函数。

附言:

后端大哥处理导入文件的处理逻辑:

1.处理tgz格式的压缩包

2.获取文件流(MultipartFile file)

3.先上传服务器作为临时文件供解析使用(解析需要校验,需要上传才能解析)

4.判断指定目录下指定文件是否存在,存在的话就解析json格式文件,并返回jsonArray数组

5.将临时文件复制到指定目录(因为只能在指定目标目录下才能构建)

6.根据jsonArray的数据入库,返回构建的需要参数

7.根据所传参数构建vue组件(这里的vue组件就是一个页面)

到此这篇关于使用element-ui的upload组件上传代码包时遇到的问题及总结的文章就介绍到这了,更多相关element-ui的upload组件上传内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在vue项目中使用element-ui的Upload上传组件的示例

    本文介绍了vue项目中使用element-ui的Upload上传组件的示例,分享给大家,具体如下: <el-upload v-else class='ensure ensureButt' :action="importFileUrl" :data="upLoadData" name="importfile" :onError="uploadError" :onSuccess="uploadSuccess&quo

  • 解读element-ui使用el-upload,before-upload函数不好使的问题

    目录 element-ui使用el-upload,before-upload函数不好使 解决方式 ElementUI el-upload上传图片限制,before-upload不生效 总结 element-ui使用el-upload,before-upload函数不好使 在使用el-upload这个组件的时候,业务是需要传其他参数给后台,所以校验写在before-upload中,在before-upload中直接返回true或者是false,依然会发文件给后台 参数 说明 类型 可选值 默认值

  • vue-cli3.0+element-ui上传组件el-upload的使用

    最近项目中涉及很多文件上传的地方,然后文件上传又有很多限制.比如文件大小限制,文件个数限制,文件类型限制,文件上传后的列表样式自定义,包括上传进度条等问题.下面是我对element-ui的上传组件的一些改造, 点击查看源码. 我是自己维护了一个列表数据,再对这个列表数据进行一些操作,没用组件自带的.先看看我的组件模版 <template> <el-upload class="upload-demo" :limit="limit" :action=&

  • element UI upload组件上传附件格式限制方法

    如下所示: <el-upload :action="uploadUrl" ref="upload" :multiple="false" :on-change="fileChange" :before-upload="beforeUpload" :on-success="handleAvatarSuccess" :on-preview="file_click" c

  • ant design中upload组件上传大文件,显示进度条进度的实例

    Upload组件是自带上传进度,但是样式调起来很麻烦,我们要做的就是自定义一个 首先页面要引入组件 Upload, Progress uploadAttachmentsProps = { action: `/api/upload`, showUploadList: false, // 这里关闭自带的列表 beforeUpload: (info) => { /* 上传前的钩子,可以用来判断类型,和大小 if ('是否符合类型') { return false } if ('是否符合类型') { r

  • antd Upload 文件上传的示例代码

    1.antd官网Upload组件: https://ant.design/components/upload-cn/ 2.下图是最近开发的上传文档的效果: 3.文件上传的实现: (1)方法一:antd默认上传. a:渲染文件上传组件.getPDFURL()方法为实现文件的上传.showUploadList为是否展示 uploadList, true显示,false不显示,其可设为一个对象,用于单独设定 showPreviewIcon 和 showRemoveIcon.type为上传按钮的图标.如

  • Vue+UpLoad实现上传预览和删除图片的实践

    1.用vue+Element完成一个图片上传.点图预览.加删除功能,如图: 2.首先我们再组件中引入这一段代码,每个属性的使用也都放在这里了: <el-upload class="upload-demo" action=""//引号里面填要上传的图片地址,用接口的话是公共的接口地址拼接一个图片的接口 :on-preview="handlePreview"//图片已经上传完成时点击触发(钩子函数) :on-remove="handl

  • Angular2仿照微信UI实现9张图片上传和预览的示例代码

    本来在看vue.js没多久,最近在赶一个项目用回了angular2,还是先把ng2搞定吧,毕竟还不怎么懂.这两天我做的是用户表单数据的提交,大部分很简单,双向绑定就完事了,主要还是沟通的问题哈哈哈哈,虽然沟通的时候有点暴躁想甩锅,不过出了门还是高高兴兴吃饭高高兴兴回去. 好了切入问题.这几天做得最久的是仿照微信UI做的图片上传/显示缩略图/预览/删除功能,要求图片1--9张.下面来记录下如何实现微信的图片预览/删除功能. 样式--weui.css 样式用的是微信官方ui,weui.min.css

  • Asp无组件上传进度条解决方案

    一.无组件上传的原理我还是一点一点用一个实例来说明的吧,客户端HTML如下.要浏览上传附件,我们通过<input type="file">元素,但是一定要注意必须设置form的enctype属性为"multipart/form-data": <form method="post" action="upload.asp" enctype="multipart/form-data">&l

  • jQuery File Upload文件上传插件使用详解

    jQuery File Upload 是一个Jquery文件上传组件,支持多文件上传.取消.删除,上传前缩略图预览.列表显示图片大小,支持上传进度条显示:支持各种动态语言开发的服务器端. 官网链接:https://github.com/blueimp/jQuery-File-Upload/wiki 特点:拖放支持:上传进度条:图像预览:可定制和可扩展的:兼容任何服务器端应用平台(PHP, Python, Ruby on Rails, Java, Node.js, Go etc.). 使用方法:

  • vue+element+oss实现前端分片上传和断点续传

    纯前端实现: 切片上传 断点续传 .断点续传需要在切上上传的基础上实现 前端之前上传OSS,无需后端提供接口.先上完整代码,直接复制,将new OSS里的参数修改成自己公司OSS相关信息后可用,如遇问题,请继续往下看. oss官方文档 https://help.aliyun.com/document_detail/111268.html?spm=a2c4g.11186623.6.1111.5a583a07LknRUO 代码允许所需环境:vue + element + ali-oss 安装ali-

  • element自定义表单验证上传身份证正反面的实现

    大概是这个样式 两个上传组件写在一个form-item里进行自定义表单验证 每次验证,通过判断上传组件绑定的值进行判断,callback不同的提示错误 <template> <div> <el-form :model="personalForm" :rules="rules" ref="personalForm" label-width="180px"> <el-row> <

  • react中antd Upload手动上传的示例

    目录 情况介绍 实现方法 1.初始化 2.上传表单和图片 3.图片回显 情况介绍 在antd官方提供的upload组件案例中,都使用了action属性直接上传,唯一手动上传的一个例子(如下图)也不够好用,可能不能满足项目的需求,所以我们需要对其进行一些修改,并加入一些别的方法. 我们经常会使用antd的form表单上传数据,有时就会需要同时上传图片.所以在这里我们需要实现的是,前端页面上传多张图片时,先存储在前端,当表单上传时,和表单数据一起上传到后端. 实现方法 1.初始化 首先,在最前面引入

随机推荐