一、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. 基于ORB-SLAM2的图片识别

    基于ORB-SLAM2的图片识别,其功能是首先运行ORB-SLAM2,在运行过程中调起另一个线程进行图像识别,识别成功后在图片上渲染AR中的立方体模型. 识别过程主要基于ORB-SLAM2中的BoW算 ...

  2. IT兄弟连 Java语法教程 关系运算符

    关系运算符用来判定一个操作数与另外一个操作数之间的关系.特别是,它们可以判定相等和排序关系.表7中列出了关系运算符. 表7  关系运算符 关系运算符的结果为布尔值.关系运算符最常用与if语句和各种循环 ...

  3. SpringBoot系列之@PropertySource用法简介

    SpringBoot系列之@PropertySource用法简介 继上篇博客:SpringBoot系列之@Value和@ConfigurationProperties用法对比之后,本博客继续介绍一下@ ...

  4. python TKinter的主窗口运行程序完毕后,怎么让其自动关闭

    如题: 在pycharm 调试Tkinter程序的时候,关闭右上角的X 实际上并未退出进程,长期以往 再大的内存也会被耗尽. 一般就是下面的代码: """ from tk ...

  5. Jenkins操作学习 --初始化安装

    前言 说到持续集成,可以说是当下比较热门的话题了,也是很多公司和It从业者推崇的热门技术,但在项目中真正实际应用起来的并不太多,但通过持续集成带来的好处还是值得学习和推广的. 1.什么是jenkins ...

  6. PHP 扩展与 ZEND 引擎的整合

    PHP 扩展是对 PHP 功能的一个补充,编写完 PHP 扩展以后, ZEND 引擎需要获取到 PHP 扩展的信息,比如 phpinfo() 函数是如何列出 PHP 扩展的信息,PHP 扩展中的函数如 ...

  7. 五分钟搞定 HTTPS 配置,二哥手把手教

    01.关于 FreeSSL.cn FreeSSL.cn 是一个免费提供 HTTPS 证书申请.HTTPS 证书管理和 HTTPS 证书到期提醒服务的网站,旨在推进 HTTPS 证书的普及与应用,简化证 ...

  8. SpringBoot中数据加密存储和获取后解密展示AttributeConverter的实现

    1. 需求: 数据库存入数据的时候要加密处理,不同的字段加密方式不同. 界面上展示的时候要解密处理,解密方式相同. 2. 实现方案一: 定义公共的加密解密方法,然后在对应的字段上重写他的getset方 ...

  9. 死磕 java同步系列之StampedLock源码解析

    问题 (1)StampedLock是什么? (2)StampedLock具有什么特性? (3)StampedLock是否支持可重入? (4)StampedLock与ReentrantReadWrite ...

  10. WPF TextBox绑定Int类型的属性

    TextBox双向绑定int属性,清空输入框时Setter方法未触发. 我的解决方案: 1.属性置为int?: 2.xmlns:sys="clr-namespace:System;assem ...