前言

最近在做后台管理项目,采用的 vue-element-admin ,上传图片是一个很常用的功能,也遇到了很多问题,刚好趁此机会做一些总结。

初步总结下会提到的问题,目录如下:

  1. el-upload 自定义上传方法
  2. 图片上传到七牛云
  3. 图片压缩后再上传(压缩使用 lrz
  4. el-upload 进度条不显示的问题

版本信息:

  • element-ui 2.3.4
  • vue 2.5.10

提示:

由于每个人做的业务不尽相同,所以文章里的代码只是起一个引导作用,提供一个思路,具体可以根据自己的需求来调整。

正文

上传图片到七牛云

这个需要前后端的配合才能实现,这里 是官方的 JavaScript SDK 参考链接。

  • 在使用 JS-SDK 之前,您必须先注册一个七牛帐号,并登录控制台获取一对有效的 AccessKey 和 SecretKey,您可以阅读 快速入门  安全机制 以进一步了解如何正确使用和管理密钥 。

  • JS-SDK 依赖服务端颁发 token,可以通过以下二种方式实现:

    1. 利用七牛服务端 SDK 构建后端服务
    2. 利用七牛底层 API 构建服务,详见七牛上传策略上传凭证

前端通过接口请求以获得 token 信息

前端需要去拿到后端生成的 token 才可以上传图片。

自定义上传,上传前可压缩

http-request 属性可以覆盖默认的上传行为,自定义上传的实现。

主要来看一下这个自定义的函数的代码实现:

  1. // 自定义的上传实现函数
  2. handleHttpRequest(req) {
  3. // uid 作为唯一标识,方便上传完成后精准地替换图片 url
  4. const uid = req.file.uid
  5. // 获取文件后缀名的函数
  6. const ext = getFileExt(req.file.name)
  7. // 自定义 key ,上传时对图片的重命名会用到
  8. let keyname = this.$formatDate(new Date(), 'yyyyMMddhhmmss') + Math.floor(Math.random() * 1000) + '.' + ext
  9. // 压缩图片
  10. let newFile = null
  11. lrz(req.file, {
  12. quality: 0.7
  13. }).then(rst => {
  14. // 压缩完成
  15. newFile = rst.file
  16. // 创建form对象,上传七牛云所需要的参数
  17. const fileData = new FormData()
  18. fileData.append('file', newFile)
  19. fileData.append('token', this.token)
  20. fileData.append('key', keyname)
  21. const config = {
  22. headers: { 'Content-Type': 'multipart/form-data' },
  23. // 这一段代码解决进度条不显示的问题,属于 axios 的使用知识。具体可以看文末的参考链接。
  24. onUploadProgress: progressEvent => {
  25. const percentCompleted = Math.floor((progressEvent.loaded * 100) / progressEvent.total)
  26. req.onProgress({ percent: percentCompleted })
  27. }
  28. }
  29. // 请求七牛云的接口,具体看自己怎么配置
  30. // 这里的 action 是请求地址,fileData 是请求发送的内容,config 是 http 的相关配置
  31. // 官方的请求地址可以查看这个链接:https://developer.qiniu.com/kodo/manual/1671/region-endpoint
  32. axios.post($config[this.bucket].action, fileData, config).then(res => {
  33. const url = `${$config[this.bucket].domain}/${res.data.key}`
  34. // 修改 url
  35. this.fileList.forEach((item) => {
  36. if (item.uid === uid) {
  37. item.url = url
  38. }
  39. })
  40. req.onSuccess(res)
  41. }).catch(err => {
  42. req.onError(err)
  43. })
  44. }).catch(err => {
  45. console.log(err)
  46. })
  47. }

压缩图片

这里直接采用前人造的轮子,可以设置压缩比例和图片的尺寸限制。

想看更多细节的话地址在 这里 ,上面代码里也有用到,但是这个轮子作者已经不再维护了。

el-upload 进度条不显示

使用自定义上传后,我发现 el-upload 自带的进度条显示失效了,这个问题查找了比较久,一开始一直不知道应该在哪里去监听 progress 事件。

参考链接里的顺序就是我思考的顺序。

先是去查了下官方的 issue ,意识到是监听 process 的问题,然后就想 axios 是不是有相关的设置呢?毕竟我这里是用 axios 发请求的,所以又谷歌直接搜关键词「axios upload progress」,找到了一些相关的信息,就是在 config 里去配置 onUploadProgress 函数,具体代码见上面的例子。

参考链接:

  1. upload组件的 http:request 怎么获取进度值
  2. 谷歌 axios upload progress 找到的 其一
  3. 谷歌 axios upload progress 找到的 其二

(完)

element 上传组件 el-upload 的经验总结的更多相关文章

  1. vuetify | vue | 文件上传组件 | file | upload | form input[type="file"]

    今天无聊地写vuecli3听歌的时候,遇到了上传文件到Django的自我需求,然后就到vuetify的表单组件里找upload btn,发现居然没有!!! 顿时惊了个呆,要知道之前用element做操 ...

  2. ASP中文件上传组件ASPUpload介绍和使用方法

    [导读]要实现该功能,就要利用一些特制的文件上传组件.文件上传组件网页非常多,这里介绍国际上非常有名的ASPUpload组件 1 下载和安装ASPUpload  要实现该功能,就要利用一些特制的文件上 ...

  3. 封装Vue Element的upload上传组件

    本来昨天就想分享封装的这个upload组件,结果刚写了两句话,就被边上的同事给偷窥上了,于是在我全神贯注地写分享的时候他就神不知鬼不觉地突然移动到我身边,腆着脸问我在干啥呢.卧槽你妈,当场就把我吓了一 ...

  4. 页面中使用多个element-ui upload上传组件时绑定对应元素

    elemet-ui里提供的upload文件上传组件,功能很强大,能满足单独使用的需求,但是有时候会存在多次复用上传组件的需求,如下图的样子,这时候就出现了问题,页面上有多个上传组件时,要怎么操作呢? ...

  5. element-ui upload上传组件问题记录

    element-ui upload上传组件遇到的问题

  6. 封装react antd的upload上传组件

    上传文件也是我们在实际开发中常遇到的功能,比如上传产品图片以供更好地宣传我们的产品,上传excel文档以便于更好地展示更多的产品信息,上传zip文件以便于更好地收集一些资料信息等等.至于为何要把上传组 ...

  7. Vue.js 3.0搭配.NET Core写一个牛B的文件上传组件

    在开发Web应用程序中,文件上传是经常用到的一个功能. 在Jquery时代,做上传功能,一般找jQuery插件就够了,很少有人去探究上传文件插件到底是怎么做的. 简单列一下我们要做的技术点和功能点 使 ...

  8. 基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用

    大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中 ...

  9. ajax上传组件

    BJUI框架的异步上传组件功能. 初始化: 1.Data属性:div添加属性data-toggle="upload"后可触发上传组件. 示例代码: <div class=&q ...

随机推荐

  1. shell多线程之进程间通信

    # 这是一个简单的并发程序,有如下要求: # .有两个程序a和b,希望他们能并发执行,以节约时间 # .a和b都是按照日期顺序执行,但b每日程序的前提条件是当日a的程序已经执行完毕 #解决方案: # ...

  2. 系列教程 之 Android开发之旅

    工作室持续推出Android开发系列教程与案例,供广大朋友分享交流技术经验,帮助喜欢Android的朋友们学习进步: 1. Android开发之旅(1) 之 Android 开发环境搭建 代码之间工作 ...

  3. 推荐三个学习git的网站或教程

    廖雪峰官方教程:https://www.liaoxuefeng.com/wiki/896043488029600/900388704535136 ProGit中文版:https://git-scm.c ...

  4. Angular4.0从入门到实战打造在线竞拍网站学习笔记之二--路由

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 Angular4.0依赖注入 Angular4.0数据绑定&管道 路由 简介 接下来学习路由的相关知识 本来是不准备写下 ...

  5. Spark学习之路(四)—— RDD常用算子详解

    一.Transformation spark常用的Transformation算子如下表: Transformation算子 Meaning(含义) map(func) 对原RDD中每个元素运用 fu ...

  6. 【React】react学习笔记03-React组件对象的三大属性-state

    今天晚上学习了React中state的使用,特做此记录,对于学习的方式,博主仍然推荐直接复制完整代码,对着注释观察现象!: 上文中,我列举了两种React自定义组件的声明,这里我拿方式二进行举例: / ...

  7. http协议之状态码

    =================状态码,状态文字======================== 状态码:用来反应服务器的响应状态 状态文字:是用来说明状态码的. 状态码:可以分为这5个大的部分 - ...

  8. Ruby中的数值

    数值类型 Ruby中所有数值都是Numeric类的子类对象,数值都是不可变对象. 数值类型的继承关系如下: Integer是整数,Float是浮点数类型,Rational是分数. 对于整数,要么是Fi ...

  9. 【HDU - 1495】非常可乐

    -->非常可乐  Descriptions: 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一 ...

  10. HDU 5723:Abandoned country(最小生成树+算期望)

    http://acm.hdu.edu.cn/showproblem.php?pid=5723 Abandoned country Problem Description   An abandoned ...