使用Qiniu-JavaScript-SDK上传文件至七牛云存储
一、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上传文件至七牛云存储的更多相关文章
- laravel上传文件到七牛云存储
背景 最近在用PHP和laravel框架做一个图片网站,需要将图片存贮到云端,搜索下了对比了下功能,发现七牛云存储不错(主要小流量免费),便选择使用七牛作为图片存储空间. 要实现的功能很简单,选择本地 ...
- 记一次上传文件到七牛云存储的经历(Plupload & UEditor)(.net)
七牛 配置ACCESS_KEY和SECRET_KEY Qiniu.Conf.Config.ACCESS_KEY = "ACCESS_KEY"; Qiniu.Conf.Config. ...
- RN 上传文件到以及上传文件到七牛云(初步)
本文将介绍: 如何使用原生 Javascript 上传文件 如何使用七牛云 SDK 上传文件到七牛云 在 App 中文件上传是一个非常重要的需求,但是翻遍 React Naitve 的官方文档没有发现 ...
- SpringSpringBoot上传文件到七牛云
准备工作 maven pom.xml添加七牛云的sdk依赖 <dependency> <groupId>com.qiniu</groupId> <artifa ...
- 利用ThinkPHP自带的七牛云驱动上传文件到七牛云以及删除七牛云文件方法
一.准备工作 1.注册七牛云账号 2.选择对象储存->创建空间->设置为公开 3.在config配置文件中添加以下代码 'UPLOAD_FILE_QINIU' => array ( ...
- c++使用http协议上传文件到七牛云服务器
使用c++ http协议上传文件到七牛服务器时,比较搞的一点就是header的设置: "Content-Type:multipart/form-data;boundary=xxx" ...
- java(SSM)上传文件到七牛云(对象存储)
项目中会用到大量的图片和小视频,为了分担服务器压力,将文件都放在七牛云.这里的思路很简单, 就是移动端.pc端把文件上传到服务器,服务器做一个临时缓存,保存必要的信息到数据库后, 将文件上传到七牛云, ...
- 使用python3.7+Vue.js2.0+Django2.0.4异步前端通过api上传文件到七牛云云端存储
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_130 之前一篇文章是通过普通js+tornado来上传七牛云:使用Tornado配合七牛云存储api来异步切分上传文件,本次使用v ...
- Laravel-admin 七牛云上传文件到七牛云出现卡顿失败情况
由于所做项目需要管理后台众多,所以选择了Laravel-admin后台框架进行开发.节省了权限控制以及页面处理等问题的时间 Laravel-admin文档地址 http://laravel-admin ...
随机推荐
- Linux服务器下配置Java环境、JDK
前言 可以解决问题有/etc/profile与~/.bashrc环境文件区别 文件权限问题,只读readonly Java环境搭建 一.下载JDK包 地址:jdk1.8提取码:gx0b 把文件放到Li ...
- tushare+pandas实现财经数据分析
写在前面的话: 这是一个优秀的财经接口包,博主平时工作中也有使用,觉得很好,现在分享一些使用心得给需要的人,tushare并不是一个炒股软件,只是一个提供pandas数据的工具,具体如何使用,因人而异 ...
- 【linux命令】权限管理命令(chattr、lsattr、sudo)
目录 chattr lsattr sudo 一.chattr命令 chattr命令用来修改文件系统的权限属性,只有 root 用户可以使用,建立凌驾于 rwx 基础权限之上的授权. PS:chattr ...
- 使用vue组件需要注意的4个细节
细节1:table(表格)中直接引用自定义组件出现的bug 如上图,tr本应在tbody中面,现在却是同级.造成的原因是h5规定table里必须有tbody,tbody中必须有tr, 当tbody中引 ...
- win10下mysql5.7的安装与配置
Win10下MySql5.7的安装与配置 下载 官网下载地址 选择免安装版即可, 解压 将下载的压缩包解压到你想要放置MySQL的目录,避免中文空格. 示例:D:\devtools\mysql-5.7 ...
- oracle学习笔记(二十二) REF 动态游标
动态游标 定义语法 --声明 $cursor_name$ sys_refcursor --打开动态游标 open $cursor_name$ is 查询语句; --关闭游标 close $cursor ...
- WPF中Button的背景图片,实现禁止IsMouseOver时显示默认
<Button x:Name="btnPickUpNum" Click="PickUpNum_OnClick" Grid.Row="1" ...
- spring web mvc环境搭建
这两天在学习spring,哎,没办法呀,成都基本都是java,不喜欢学这个也没有用.多学点多条路.还得生活不是. 好了,言归正传,我这里记录下我搭建spring mvc的过程,其实过程不算太难,主要是 ...
- TCP协议的三次握手与四次挥手
1.数据包说明 1)源端口号(16位):它(连同源主机IP地址)标识源主机的一个应用进程. 2)目标端口号(16位):它(连同源主机IP地址)标识目的主机的一个应用进程.这两个值加上IP报头中的源主机 ...
- css布局技巧
CSS用户界面样式 鼠标样式currsor li{ cursor:pointer: } 设置或检索在对象上移动鼠标指针采用何种系统预定义的光标形状 属性值 描述 default 默认 pointer ...