1、七牛云存储使用参考文档
# 七牛云管理后台地址
https://portal.qiniu.com/kodo/bucket
# 七牛云使用
https://developer.qiniu.com/kodo/manual/1233/console-quickstart
# pythonSDK
https://developer.qiniu.com/kodo/sdk/1242/python
# Node.js SDK V6
https://developer.qiniu.com/kodo/sdk/3828/node-js-v6
# JavaScript SDK历史文档1.x
https://developer.qiniu.com/kodo/sdk/4244/the-javascript-sdk-historical-documents-1-x
2、七牛云介绍
1. 以前看见过FastDfs+FFmpeg进行视频存储等操作,但是这种方式稳定性会低一些,而且成本也没有降低。
2. 市面上关于云存储的第三方服务比比皆是,最著名的无疑就是七牛云存储,本次我们将演示用django+Vue+七牛云进行视频存储与播放。
3、七牛云上传逻辑
1. 在做七牛云的文件上传时,很多人有一个误区,就是以为是前端先上传到后台服务器,然后后台服务器再将文件上传到七牛云。
2. 这个逻辑本身没有问题,但是会遇到一个问题,如果文件大会导致上传很慢
3. 正确逻辑应该是前端直接上传七牛,而后台只承担生成token和存储七牛云返回的hash的任务。
1.2 django+JavaScript上传视频
1、参考七牛云SDK
# pythonSDK
https://developer.qiniu.com/kodo/sdk/1242/python# JavaScript SDK历史文档1.x
https://developer.qiniu.com/kodo/sdk/4244/the-javascript-sdk-historical-documents-1-x# JavaScript 官方demohttps://github.com/qiniu/js-sdk/tree/1.x#demo
2、代码
from django.shortcuts import render,HttpResponse
from django.views import View
import json
'''获取上传token'''
class QNYTokenView(View):
def get(self,request):
from qiniu import Auth, put_file, etag
import qiniu.config
# 需要填写你的 Access Key 和 Secret Key
access_key = 's-hjo_Y5PSl***************lNLzTNrCig_0dN'
secret_key = 'dnMGngbNbFK***************l_XFlo49lc4YyM'
# 构建鉴权对象
q = Auth(access_key, secret_key)
# 要上传的空间
bucket_name = '460-chao'
# 生成上传 Token,可以指定过期时间等
token = q.upload_token(bucket_name, expires=3600)
return HttpResponse(json.dumps({'uptoken': token}, ensure_ascii=False))
1.3 vue+django上传视频
*参考代码:*https://gitee.com/edushiyanlou/QiniuUploader
1、前端Vue代码
vue init webpack qiniuVue # 初始化一个vue前端项目
npm install --save axios # 安装axios
npm install --save jquery@1.12.1 # 安装jquery
django代码样式
from django.shortcuts import render,HttpResponse
from django.views import View
import json
'''获取上传token'''
class QNYTokenView(View):
def get(self,request):
from qiniu import Auth, put_file, etag
import qiniu.config
# 需要填写你的 Access Key 和 Secret Key
access_key = 's-hjo_Y5PSl***************lNLzTNrCig_0dN'
secret_key = 'dnMGngbNbFK***************l_XFlo49lc4YyM'
# 构建鉴权对象
q = Auth(access_key, secret_key)
# 要上传的空间
bucket_name = '460-chao'
# 生成上传 Token,可以指定过期时间等
token = q.upload_token(bucket_name, expires=3600)
return HttpResponse(json.dumps({'uptoken': token}, ensure_ascii=False))
vue代码样式
<template>
<div>
<input type="file" name='upFile' id="upFile" @change='changeFile($event)'>
<input type="button" name="开始上传" value="开始上传" @click='uploadFile()'>
<img v-if="coverUrl" :src="coverUrl" alt="封面">
<el-progress :percentage="filePercent"></el-progress>
{{filePercent}}
</div>
</template>
<script>
import * as qiniu from "qiniu-js";
export default {
name:'qiniu',
data() {
return {
file:null,
videoUrl:null,
coverUrl:null,
filePercent:0
};
},
methods: {
changeFile(e){
// 获取文件
this.file = e.target.files[0];
},
uploadFile() {
// 当前VUE中的this 是指向实例,相当于父级,指向指不到子级中。所需需要一个变量 _this 存储this得指向。
let _this = this
// 获取身份的token
let token = 's-hjo_Y5PSlHGOaMLn-NfKHmxrlNLzTNrCig_0dN:fXoqUiOuAYEWnsGws3dLmJXnL80=:eyJzY29wZSI6IjQ2MC1jaGFvIiwiZGVhZGxpbmUiOjE2MDQ5MjYyNTB9',
// 上传时的配置
var config = {
useCdnDomain: true
};
// 设置文件的配置
var putExtra = {
fname: "",
params: {},
mimeType: null
};
// 实例化七牛云的上传实例
var observable = qiniu.upload(_this.file, null, token, putExtra, config);
// 设置实例的监听对象
var observer = {
// 接收上传进度信息
next(res) {
// 上传进度
_this.filePercent = parseInt(res.total.percent)
if(_this.filePercent==100){
console.log("success")
}
},
// 接收上传错误信息
error(err) {
console.log(err)
},
// 接收上传完成后的信息
complete(res) {
console.log(res.key)
}
};
// 上传开始
var subscription = observable.subscribe(observer);
}
}
};
</script>