一、Qiniu-JavaScript-SDK介绍

  基于 JS-SDK 可以方便的从浏览器端上传文件至七牛云存储,并对上传成功后的图片进行丰富的数据处理操作。
  JS-SDK 兼容支持 H5 File API 的浏览器,在低版本浏览器下,需要额外的插件如 plupload,JS-SDK 提供了一些接口可以结合插件来进行上传工作。

  Qiniu-JavaScript-SDK 为客户端 SDK,没有包含 token 生成实现,为了安全,token 建议通过网络从服务端获取,具体生成代码可以参考服务端 SDK 的文档。

1、参考文档

  官方API文档:JavaScript SDK

  基于七牛 API 开发的前端 JavaScript SDK 源码地址:https://github.com/qiniu/js-sdk

2、引入(NPM安装)

  NPM 的全称是 Node Package Manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布 Node 模块(包)的标准。

$ npm install qiniu-js

二、vue项目实现  

  创建七牛上传组件:/src/components/chart/QiniuUpload.vue

  下面代码中集成了上传进度条,及上传完成提示,还添加了已上传文件的文件名显示:

<template>
<div class="ft-plant-upload-button" :class="boxClass">
<Button class="upload-btn" type="ghost" icon="ios-cloud-upload-outline" :disabled="percent > 0 && percent < 100" @click="zh_uploadFile">{{qiniuUploadDesc}}</Button>
<div class="progress-wraper" v-if="showProgress">
<div class="progress" v-if="percent > 0 && percent < 100">
<div class="progress-bar" role="progressbar" aria-valuemin="0" aria-valuemax="100" :style="{width: percent+'%'}">
</div>
</div>
<div class="precent" v-if="percent > 0 && percent < 100">
{{percent || 0 }}%
</div>
</div>
<div class="file-name" v-else>
{{fileName}}
</div>
<input type="file" ref="evfile" @change="zh_uploadFile_change" style="display:none">
<input type="hidden" :value="qiniuKey">
</div> </template> <script>
import * as qiniu from "qiniu-js" export default {
name: "QiniuUpload",
props: { // 子组件的props选项
qiniuUploadDesc: {
type: String,
default: '上传文件'
},
classroomUpload: {
default: '未知classroom'
},
filetype: {
type: String
},
boxClass: {
type: String,
default: ''
},
fileName: {
type: String
}
},
data(){
return {
queryInfo: {
limit: 10,
offset: 0,
},
token: "",
qiniuKey: "",
percent: 0,
percentText: "",
showProgress: false
}
},
methods: {
beforeImageUpload(file) { // 限制图片格式和大小
const isPng = file.type === "image/png";
const isJpeg = file.type === "image/jpeg";
const isJpg = file.type === "image/jpg";
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isPng && !isJpeg && !isJpg) {
this.$showDialog("警告信息", "上传图片只能是 jpg、png、jpeg 格式!");
return false; // 等同于retrun false; 不执行
} else if (!isLt2M) {
this.$showDialog("警告信息", "上传图片大小不能超过2MB!");
return false;
} else {
return true;
}
},
httpGetList: function () {
var self = this;
this.$httpGet(this.$http, "users/dataController/getUploadToken", this.$trimJson(self.queryInfo), function (ret) {
console.log('ret', ret.token);
return ret.token;
});
},
//选择上传文件
zh_uploadFile(){
this.$refs.evfile.click();
},
//选择文件后触发的事件
zh_uploadFile_change(evfile){
if (evfile){
this.showProgress = true; // 显示上传过程
//后端获取token
this.getQiniuToken().then(res=>{
console.log('res', res);
var uptoken = res;
var userno = this.$sessionUser.fetch().userno;
var timestamp = Date.parse(new Date()); // 时间戳
var file = evfile.target.files[0]; //Blob 对象,上传的文件
var key = "";
if (this.filetype === "idCodeImg") {
// 身份证照片
if (this.beforeImageUpload(file)) {
key = this.filetype + '/U' + userno + 'T' + timestamp + '/' + file.name;
} else {
return;
}
} else if (this.filetype === "cardImg") {
// 证件照片
if (this.beforeImageUpload(file)) {
key = this.filetype + '/U' + userno + 'T' + timestamp + '/' + file.name;
} else {
return;
}
} else{
// 课堂附件
this.$emit('change', file.name);
key = this.filetype + '/' + this.classroomUpload + '/U' + userno + 'T' + timestamp + '.' + file.name.split('.').pop(); // 上传后文件资源名,以设置的 key 为主,如果 key 为 null 或者 undefined,则文件资源名会以 hash 值作为资源名。
}
let config = {
useCdnDomain: true, // 表示是否使用 cdn 加速域名,为布尔值,true 表示使用,默认为 false。
region: qiniu.region.z1 // 上传域名区域(z1为华北),当为 null 或 undefined 时,自动分析上传域名区域
}; let putExtra = {
fname: "", // 文件原文件名
params: {}, // 放置自定义变量: 'x:name': 'sex'
mimeType: null // 限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"]
}; // observable是一个带有 subscribe 方法的类实例
var observable = qiniu.upload(file, key, uptoken, putExtra, config);
var subscription = observable.subscribe({ // 上传开始
next: (result) => {
// 接收上传进度信息,result是带有total字段的 Object
// loaded: 已上传大小; size: 上传总信息; percent: 当前上传进度
console.log(result); // 形如:{total: {loaded: 1671168, size: 2249260, percent: 74.29856930723882}}
this.percent = result.total.percent.toFixed(0);
},
error: (errResult) => {
// 上传错误后失败报错
console.log(errResult)
},
complete: (result) => {
// 接收成功后返回的信息
console.log(result); // 形如:{hash: "Fp5_DtYW4gHiPEBiXIjVsZ1TtmPc", key: "%TStC006TEyVY5lLIBt7Eg.jpg"}
this.qiniuKey = result.data.key;
this.showProgress = false;
this.$emit('key', this.qiniuKey);
this.$emit('url', result.data.url);
}
})
})
}
},
getQiniuToken(){
return new Promise((resolve, reject)=>{
var self = this;
this.$httpGet(this.$http, "users/dataController/getUploadToken", this.$trimJson(self.queryInfo), function (ret) {
console.log('ret', ret.token);
resolve(ret.token);
});
})
}
},
mounted() {
this.$pageInit();
this.fileToken = this.$sessionUser.fetch().fileToken;
}
}
</script>

2、在父组件中引入七牛上传组件

  使用props传递属性到子组件。这样可以拼接出比较复杂的文件名(key: 文件资源名)。

<template>
<div class="app-content">
<section class="section">
<v-breadcrumb></v-breadcrumb>
<div class="section-body">
<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<h4>编辑/添加招生学生</h4>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<div class="form-group row">
<label for="idCardFront" class="col-md-4 col-form-label">身份证正面上传(头像)</label>
<QiniuUpload id="idCardFront" filetype="idCodeImg" :qiniuUploadDesc="'上传图片'" :boxClass="'add-idImg1'"
@url="setFrontUrl" :fileName="queryInfo.idImg1.split('/').pop()">
<template slot="uploadTitle">
</template>
</QiniuUpload>
</div>
<div class="form-group row">
<label for="idCardBack" class="col-md-4 col-form-label">身份证反面上传(国徽)</label>
<QiniuUpload id="idCardBack" filetype="idCodeImg" :qiniuUploadDesc="'上传图片'" :boxClass="'add-idImg2'"
@url="setBackUrl" :fileName="queryInfo.idImg2.split('/').pop()">
<template slot="uploadTitle">
</template>
</QiniuUpload>
</div>
</div>
<div class="col-md-6">
<div class="form-group row">
<label for="cardType" class="col-md-3 col-form-label">学历证件</label>
<div class="col-md-5 m-t-5 m-b-5">
<Enums type="card_type" id="cardType" v-model="queryInfo.cardType" placeholder="请选择证件类型"></Enums>
</div>
</div>
<div class="form-group row">
<label for="idCardBack" class="col-md-3 col-form-label">学历证件上传</label>
<QiniuUpload id="cardImg" filetype="cardImg" :qiniuUploadDesc="'上传图片'" :boxClass="'add-cardImg'"
@url="setCardUrl" :fileName="queryInfo.cardImg.split('/').pop()">
<template slot="uploadTitle">
</template>
</QiniuUpload>
</div>
</div>
</div>

使用Qiniu-JavaScript-SDK上传文件至七牛云存储的更多相关文章

  1. laravel上传文件到七牛云存储

    背景 最近在用PHP和laravel框架做一个图片网站,需要将图片存贮到云端,搜索下了对比了下功能,发现七牛云存储不错(主要小流量免费),便选择使用七牛作为图片存储空间. 要实现的功能很简单,选择本地 ...

  2. 记一次上传文件到七牛云存储的经历(Plupload & UEditor)(.net)

    七牛 配置ACCESS_KEY和SECRET_KEY Qiniu.Conf.Config.ACCESS_KEY = "ACCESS_KEY"; Qiniu.Conf.Config. ...

  3. RN 上传文件到以及上传文件到七牛云(初步)

    本文将介绍: 如何使用原生 Javascript 上传文件 如何使用七牛云 SDK 上传文件到七牛云 在 App 中文件上传是一个非常重要的需求,但是翻遍 React Naitve 的官方文档没有发现 ...

  4. SpringSpringBoot上传文件到七牛云

    准备工作 maven pom.xml添加七牛云的sdk依赖 <dependency> <groupId>com.qiniu</groupId> <artifa ...

  5. 利用ThinkPHP自带的七牛云驱动上传文件到七牛云以及删除七牛云文件方法

    一.准备工作 1.注册七牛云账号 2.选择对象储存->创建空间->设置为公开 3.在config配置文件中添加以下代码 'UPLOAD_FILE_QINIU' => array ( ...

  6. c++使用http协议上传文件到七牛云服务器

    使用c++ http协议上传文件到七牛服务器时,比较搞的一点就是header的设置: "Content-Type:multipart/form-data;boundary=xxx" ...

  7. java(SSM)上传文件到七牛云(对象存储)

    项目中会用到大量的图片和小视频,为了分担服务器压力,将文件都放在七牛云.这里的思路很简单, 就是移动端.pc端把文件上传到服务器,服务器做一个临时缓存,保存必要的信息到数据库后, 将文件上传到七牛云, ...

  8. 使用python3.7+Vue.js2.0+Django2.0.4异步前端通过api上传文件到七牛云云端存储

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_130 之前一篇文章是通过普通js+tornado来上传七牛云:使用Tornado配合七牛云存储api来异步切分上传文件,本次使用v ...

  9. Laravel-admin 七牛云上传文件到七牛云出现卡顿失败情况

    由于所做项目需要管理后台众多,所以选择了Laravel-admin后台框架进行开发.节省了权限控制以及页面处理等问题的时间 Laravel-admin文档地址 http://laravel-admin ...

随机推荐

  1. C语言中,关于排序的问题(输入n个数,输出最大的那个)

    int n,max=0,t; scanf("%d",&n); int a[n],i,k;  //这个a[n]必须要在输入n的值之后才能定义,不然定义不成. for(i=1; ...

  2. 关于scanf的一些知识

    10.22,对现阶段已知道的scanf的一些用法或注意事项的一些总结: 1.scanf中,赋值的那个数据前面一定加&! 2.若情景要求必须输入空格的,scanf("%d%c%d&qu ...

  3. CentOS下yum方式安装FFmpeg

    FFmpeg一个完整的跨平台解决方案,用于记录,转换和流式传输音频和视频. 文档:https://www.ffmpeg.org/documentation.html FFmpeg安装 1.安装Nux ...

  4. Paper | Adaptive Computation Time for Recurrent Neural Networks

    目录 1. 网络资源 2. 简介 3. 自适应运算时间 3.1 有限运算时间 3.2 误差梯度 1. 网络资源 这篇文章的写作太随意了,读起来不是很好懂(掺杂了过多的技术细节).因此有作者介绍会更好. ...

  5. Python进阶小结

    目录 一.异常TODO 二.深浅拷贝 2.1 拷贝 2.2 浅拷贝 2.3 深拷贝 三.数据类型内置方法 3.1 数字类型内置方法 3.1.1 整型 3.1.2 浮点型 3.2 字符串类型内置方法 3 ...

  6. operator ->重载是怎么做到的?

    https://stackoverflow.com/questions/8777845/overloading-member-access-operators-c struct client { in ...

  7. ABAP 7.4 新语法-内嵌生命和内表操作(转)

    转自:https://www.cnblogs.com/mingdashu/p/6744637.html ABAP 7.4 新语法-内嵌生命和内表操作   1.内嵌声明 2.内表操作 3.opensql ...

  8. java基础(27):线程安全、线程同步、等待唤醒机制

    1. 多线程 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 我们通过一个案例,演示线程 ...

  9. 织梦DEDECMS本地后台操作卡顿的解决方法

    打开/data/common.inc.php,把默认的$cfg_dbhost = ‘localhost‘修改为$cfg_dbhost = ‘127.0.0.1’;保存.然后你会发现后台操作起来流畅多了 ...

  10. 骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 小詹&有乔木 PS:如有需要Python学习资料的小伙伴可 ...