前言

最近在做后台管理项目,采用的 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 属性可以覆盖默认的上传行为,自定义上传的实现。

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

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

压缩图片

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

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

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. surging 微服务引擎 2.0 会有多少惊喜?

    surging 微服务引擎从2017年6月至今已经有两年的时间,这两年时间有多家公司使用surging 服务引擎,并且有公司搭建了CI/CD,并且使用了k8s 集群,这里我可以说下几家公司的服务搭建情 ...

  2. Spring注解之-自定义注解

    1.自定义注解,先自定义三个水果属性的注解 元注解: java.lang.annotation提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解):   @Documented ...

  3. SpringBoot(十九)_404返回统一异常处理结果

    之前写过一篇统一异常处理的文章,今天测试了下如果访问一个不存在的接口,也想返回统一的错误信息,应该怎么做 1.修改application.properties文件 # 自定义404 #出现错误时, 直 ...

  4. GO代码生成代码小思小试

    推进需求 GO 项目,可整体生成一个运行文件到处跑,是极爽之事.但如果有资源文件要得带着跑,则破坏了这种体验. 例如下边这个项目结构,resource 目录下为资源文件,main.go 中会通过路径引 ...

  5. ubuntu16.04基本设置

    1. ubuntu16.04开启ssh https://jingyan.baidu.com/article/f54ae2fc6f9eef1e93b8497a.html 2. windows 远程桌面连 ...

  6. asp.net core 2.2 生产环境直接更新View页面并立即生效

    有的时候我们会直接在生产环境上更新页面文件,比如更改了JS代码,CSS代码或页面的文案,布局等.这种没有改到后台代码的情况一般就是直接发布页面文件了,在asp.net core 2.2以前的版本(没有 ...

  7. SQL 对float类型列进行排序引发的异常

    车祸现场 要求:根据学分和完成时间获取前200名学员,当学分相同时,完成时间较早的排在前面 可以明显看到,完成时间为4.1号的记录排在了3.27号前面. 事故原因 float 表示近似数值,存在精度损 ...

  8. JVM中的本机内存跟踪

    1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存.这些额外的分配最终会使消耗的内存超 ...

  9. Web安全深度剖析

    Web安全深度剖析 链接:https://pan.baidu.com/s/15NulgWNzQ2JPCdn9q1jE-g 提取码:6y83    Web安全深度剖析>总结了当前流行的高危漏洞的形 ...

  10. Codeforces Gym101161E:ACM Tax(主席树+LCA)

    题目链接 题意 给出一棵有边权的树,然后给出q个查询,每次查询问两个结点的路径上的边的长度的中位数是多少. 思路 这道题目是用主席树(用权值当结点)和LCA来做的. 和之前做过的区间第K大类似,这道题 ...