Vue + ElementUI 如何优雅的上传文件到七牛OSS
** 本文的上传模式是前端直传七牛oss模式,后端只负责提供token,避免泄露accessKey **
原文:原文地址,里面有效果图
1.开通七牛OSS,创建bucket,并且实名认证,详细步骤自己看官网。传送门
2.引入七牛Java SDK
<dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>[7.2.0, 7.2.99]</version> </dependency>
3.引入七牛Java SDK ,提供前端获取token API
public void getToken(){ String host = PropKit.get("qiniuHost"); String accessKey = PropKit.get("qiniuAccessKey"); String secretKey = PropKit.get("qiniuSecretKey"); String bucket = PropKit.get("qiniuBucket"); Auth auth = Auth.create(accessKey, secretKey); String token = auth.uploadToken(bucket); renderJson(RetKit.ok("token", token).set("host",host)); }
4.Vue 安装七牛提供的sdk
npm install qiniu-js
5.Elment上传组件加入http-request参数,并且把action指向http://upload.qiniup.com/
<el-upload class="avatar-uploader" action="http://upload.qiniup.com/" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" :http-request="uploadRequest" > <img v-if="form.url" :src="form.url" class="avatar"> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload>
6.编写上传JS,大体是上传的时候先向后台请求token,拿到token后调用七牛sdk直传。next 可以输出上传进度,complete上传完成。
uploadRequest: function(request) { getToken().then(res => { let token = res.token; let host = res.host; upload( token, request, next => { let total = next.total; console.log(total); }, error => { console.log(error) }, complete => { let hash = complete.hash; let key = complete.key; this.form.url = host + "/" + key; console.log(hash); console.log(key); } ) }); handleAvatarSuccess(res, file) { this.imageUrl = URL.createObjectURL(file.raw); }, beforeAvatarUpload(file) { const isLt2M = file.size / 1024 / 1024 < 2; if (!isLt2M) { this.$message.error("上传头像图片大小不能超过 2MB!"); } return isLt2M; }
import * as qiniu from 'qiniu-js' // token 找后端,obj 这里指代从 el-upload 接收到的 object export const upload = (token, obj,next,error,complete) => { const { file } = obj // 关于 key 要怎么处理自行解决,但如果为 undefined 或者 null 会使用上传后的 hash 作为 key. const key = formatDate(new Date(),"yyyyMMddhhmmss") + getRandomInt(1000, 9999) // 因人而异,自行解决 const putExtra = { fname: "", params: {}, mimeType: [] || null }, // fname: string,文件原文件名 // params: object,用来放置自定义变量 // mimeType: null || array,用来限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"] config = { useCdnDomain: true, region: qiniu.region.z2 } let options = { quality: 0.92, noCompressIfLarger: true, maxWidth: 1000, maxHeight: 618 } qiniu.compressImage(file, options).then(data => { // 调用sdk上传接口获得相应的observable,控制上传和暂停 let observable = qiniu.upload(data.dist, key, token, putExtra, config); let subscription = observable.subscribe(next,error,complete); return subscription }).catch(res => { console.log(res) return res }) }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spring的component-scan可配置化
本文是基于Spring4.3.5.RELEASE的版本进行的分析和实践 在Spring的web项目里面, 如果我们需要在类似 applicationContext.xml里面加上 <context:component-scan base-package="${component.scan.package}" /> 让base-package可配置, 那应该怎么做呢? 1. 加到Jvm的启动参数里面 比如 -Dcomponent.scan.package=com.example.yours 这里面有两个不方便的地方: 1.多个属性的话, 一个个加启动参数不方便, 2.修改了属性的值,也需要一个个修改对应的启动参数 2. 加到ServletContext里面 import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Map.Entry; import java.util.Properties; import javax.se...
- 下一篇
如何使用 redis 实现分布式幂等服务中间件
背景 在编程领域,幂等性是指对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的。 在分布式系统里,服务通常通过 RPC 或 HTTP 或其他形式对外提供。不管怎样,client 调用 server 服务都是将调用数据按特定协议封装好,然后通过网络发送给 server,server 将需要返回的数据同样按特定协议封装然后通过网络发送给 client。由于网络环境的复杂性,client 在发起调用时,数据可能在到 server 链路中丢失,也可能在从 server 返回的链路中丢失。不管哪种情况,对 client 来说都是调用失败。通常 client 会发起一次重试,如果是后者,那 server 就会收到多次完全一样的请求。如果 server 的服务不是幂等的话,就可能出现问题。 典型的例子是银行扣款服务,用函数表示为bool withdraw(account_id, amount),client 发起一次调用withdraw(1001, 10)请求从帐户 1001 中扣除 10 元,如果发生了上图所示的第 2 种错误,这时候 server 端在帐户里已经完成了...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程