# qiniu-wxapp-sdk
**Repository Path**: ShaoWuLiu/qiniu-wxapp-sdk
## Basic Information
- **Project Name**: qiniu-wxapp-sdk
- **Description**: qiniu SDK based on wxapp
- **Primary Language**: JavaScript
- **License**: GPL-3.0
- **Default Branch**: jellyfishmix
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2020-10-23
- **Last Updated**: 2021-05-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Qiniu-wxapp-SDK
============
基于七牛云 API 开发的微信小程序 SDK
### 快速导航
- [准备工作](#prepare)
- [安装与使用](#usage)
- [API](#api)
- [说明](#note)
- [常见问题](#faq)
- [ChangeLog](https://github.com/gpake/qiniu-wxapp-sdk/blob/master/CHANGELOG.md)
### 最近一次修改:
- 增加了文件在线查看功能,支持的文件格式:支持的文件格式:pdf, doc, docx, xls, xlsx, ppt, pptx。
* 增加了文件上传(从客户端会话)功能,支持从客户端会话中选择图片、视频、其它文件(PDF(.pdf), Word(.doc/.docx), Excel(.xls/.xlsx), PowerPoint(.ppt/.pptx)等文件格式)进行上传。
* demo 页面美化,增加了文件上传(从客户端会话)的UI。
* 增加了对 "通过fileURL下载文件时,自定义下载名" 的说明与样例。
* 增加了demo中获取原文件名的功能演示。
* 补充了更详细的注释,并同步对README.md进行了更新。
* 本次sdk升级兼容上一版本。js 版本更新并兼容。ts 版本已兼容,但未更新优化,ts 版本的更新优化将在日后进行。
### 概述
Qiniu-wxapp-SDK 是七牛云在小程序上的实现,网络功能依赖于微信小程序 API。您可以基于 SDK 方便的在小程序中上传文件至七牛云。
Qiniu-wxapp-SDK 为客户端 SDK,没有包含 token 生成实现,为了安全,token 建议通过网络从服务端获取,具体生成代码可以参考以下服务端 SDK 的文档。SDK Demo中暂时没有包含这部分。
- [Java](http://developer.qiniu.com/code/v7/sdk/java.html)
- [PHP](http://developer.qiniu.com/code/v7/sdk/php.html)
- [Python](http://developer.qiniu.com/code/v7/sdk/python.html)
- [Ruby](http://developer.qiniu.com/code/v6/sdk/ruby.html)
- [Go](http://developer.qiniu.com/code/v7/sdk/go.html)
- [Node.js](http://developer.qiniu.com/code/v6/sdk/nodejs.html)
- [C#](http://developer.qiniu.com/code/v6/sdk/csharp.html)
- [C/C++](http://developer.qiniu.com/code/v6/sdk/cpp.html)
### 功能简介
- 上传文件,支持图片文件、视频文件、PDF(.pdf), Word(.doc/.docx), Excel(.xls/.xlsx), PowerPoint(.ppt/.pptx)等文件格式。
- 文件在线查看,支持的文件格式:支持的文件格式:pdf, doc, docx, xls, xlsx, ppt, pptx。
其他功能在开发中,敬请期待。
### 准备
- 从 github 上下载qiniuUploader.js,导入小程序工程。
- 在使用 SDK 之前,您必须先注册一个七牛云帐号,并登录控制台获取一对有效的 AccessKey 和 SecretKey,您可以阅读[ 如何接入七牛 ](http://developer.qiniu.com/article/kodo/kodo-first/quickstart.html)和[ 安全机制 ](http://developer.qiniu.com/article/kodo/kodo-developer/index.html#security) 以进一步了解如何正确使用和管理密钥 。
- SDK 依赖服务端颁发 uptoken,可以通过以下二种方式实现:
- 利用[七牛服务端 SDK ](http://developer.qiniu.com/resource/official.html#sdk)构建后端服务(建议的方式)
- 利用七牛底层 API 构建服务,详见七牛[上传策略](http://developer.qiniu.com/article/developer/security/put-policy.html)和[上传凭证](http://developer.qiniu.com/article/developer/security/upload-token.html)
- 您需要了解您的七牛`存储空间`设置在那个区域,比如华东,华南等,参见[区域设置](#region)
后端服务应提供一个 URL 地址,供小程序请求该地址后获得 uptoken。请求成功后,服务端应返回如下格式的 json(至少包含 uptoken 字段):
```
{
"uptoken": "0MLvWPnyya1WtPnXFy9KLyGHyFPNdZceomL..."
}
```
根据你创建的七牛`存储空间`,把对应的 https 上传地址添加到小程序的访问白名单中,方法如下:
>1. 登录 [微信公众平台](https://mp.weixin.qq.com/),前往 **设置 - 开发设置**,点击 **服务器配置** 下的「**修改**」链接。
>2. 修改 uploadFile 域名(比如华东 https 上传地址为:`https://up.qiniup.com`,地址不清楚写什么请参见[https地址附录](#region))
>3. 如果需要下载文件,则还需要一同设置 **downloadFile 域名**,为你的 bucket 下载地址
>4. 保存即可
| 字段名 | 内容 |
| --------------- | ------------------------------ |
| request 域名 | https://yourServce.com |
| uploadFile 域名 | https://up.qiniup.com (根据存储区域填写) |
| downloadFile 域名 | https://baldkf.bkt.clouddn.com |
七牛云文件上传接口,文件向匹配的接口中传输,存储区域对应 HTTPS 地址,参考[官方文档](https://support.qiniu.com/hc/kb/article/210702)
| 存储区域 | 区域代码 | HTTPS 地址 |
| -------- | -------- | ---------------------- |
| 华东 | ECN | https://up.qiniup.com |
| 华北 | NCN | https://up-z1.qiniup.com |
| 华南 | SCN | https://up-z2.qiniup.com |
| 北美 | NA | https://up-na0.qiniup.com |
| 新加坡 | ASG | https://up-as0.qiniup.com |
**注意!!** 目前微信限制每月只能修改三次域名白名单。
### 安装
暂时支持一种安装方式
- 通过 Github 上的 gpake/qiniu-wxapp-sdk 仓库获取
直接克隆仓库
```
git clone https://github.com/gpake/qiniu-wxapp-sdk.git
```
qiniuUploader.js 和 qiniuUploader.ts 文件在本项目中的sdk 目录。
### 使用
#### 上传功能
建议参照demo 的用法,从demo的 ``index.wxml`` 页面 上传UI按钮绑定的事件开始看,注释写的很详细。
1. 在需要使用的页面引用js 文件:
```javascript
const qiniuUploader = require("../../../utils/qiniuUploader");
```
2. 在需要使用上传功能的页面,开心地使用:
```JavaScript
const qiniuUploader = require("../../utils/qiniuUploader");
// index.js
// 初始化七牛云相关配置
function initQiniu() {
var options = {
// bucket所在区域,这里是华北区。ECN, SCN, NCN, NA, ASG,分别对应七牛云的:华东,华南,华北,北美,新加坡 5 个区域
region: 'NCN',
// 获取uptoken方法三选一即可,执行优先级为:uptoken > uptokenURL > uptokenFunc。三选一,剩下两个置空。推荐使用uptokenURL,详情请见 README.md
// 由其他程序生成七牛云uptoken,然后直接写入uptoken
uptoken: '',
// 从指定 url 通过 HTTP GET 获取 uptoken,返回的格式必须是 json 且包含 uptoken 字段,例如: {"uptoken": "0MLvWPnyy..."}
uptokenURL: 'https://[yourserver.com]/api/uptoken',
// uptokenFunc 这个属性的值可以是一个用来生成uptoken的函数,详情请见 README.md
uptokenFunc: function () {
// do something
return qiniuUploadToken;
},
// bucket 外链域名,下载资源时用到。如果设置,会在 success callback 的 res 参数加上可以直接使用的 fileURL 字段。否则需要自己拼接
domain: 'http://[yourBucketId].bkt.clouddn.com',
// qiniuShouldUseQiniuFileName 如果是 true,则文件的 key 由 qiniu 服务器分配(全局去重)。如果是 false,则文件的 key 使用微信自动生成的 filename。出于初代sdk用户升级后兼容问题的考虑,默认是 false。
// 微信自动生成的 filename较长,导致fileURL较长。推荐使用{qiniuShouldUseQiniuFileName: true} + "通过fileURL下载文件时,自定义下载名" 的组合方式。
// 自定义上传key 需要两个条件:1. 此处shouldUseQiniuFileName值为false。 2. 通过修改qiniuUploader.upload方法传入的options参数,可以进行自定义key。(请不要直接在sdk中修改options参数,修改方法请见demo的index.js)
// 通过fileURL下载文件时,文件自定义下载名,请参考:七牛云“对象存储 > 产品手册 > 下载资源 > 下载设置 > 自定义资源下载名”(https://developer.qiniu.com/kodo/manual/1659/download-setting)。本sdk在README.md的"常见问题"板块中,有"通过fileURL下载文件时,自定义下载名"使用样例。
shouldUseQiniuFileName: false
};
// 将七牛云相关配置初始化进本sdk
qiniuUploader.init(options);
}
//获取应用实例
var app = getApp()
Page({
data: {
// 图片上传(从相册)返回对象。上传完成后,此属性被赋值
imageObject: {},
// 文件上传(从客户端会话)返回对象。上传完成后,此属性被赋值
messageFileObject: {},
// 图片上传(从相册)进度对象。开始上传后,此属性被赋值
imageProgress: {},
// 文件上传(从客户端会话)进度对象。开始上传后,此属性被赋值
messageFileProgress: {},
// 文件在线查看来源fileUrl
viewFileOnlineFileUrl: '',
// 文件下载进度对象。用于文件在线查看前的预下载
downloadFileProgress: {},
// 此属性在qiniuUploader.upload()中被赋值,用于中断上传
cancelTask: function () { }
},
//事件处理函数
onLoad: function () {
console.log('onLoad');
var that = this;
},
// 图片上传(从相册)方法
didPressChooesImage: function () {
var that = this;
didPressChooesImage(that);
},
// 文件上传(从客户端会话)方法,支持图片、视频、其余文件 (PDF(.pdf), Word(.doc/.docx), Excel(.xls/.xlsx), PowerPoint(.ppt/.pptx)等文件格式)
didPressChooesMessageFile: function () {
var that = this;
didPressChooesMessageFile(that);
},
// 在线查看文件,支持的文件格式:pdf, doc, docx, xls, xlsx, ppt, pptx。关于wx.openDocument方法,详情请参考微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/file/wx.openDocument.html
didPressViewFileOnline: function() {
var that = this;
didPressViewFileOnline(that);
},
// 中断上传方法
didCancelTask: function () {
this.data.cancelTask();
}
});
// 图片上传(从相册)方法
function didPressChooesImage(that) {
// 详情请见demo部分 index.js
}
// 文件上传(从客户端会话)方法,支持图片、视频、其余文件 (PDF(.pdf), Word(.doc/.docx), Excel(.xls/.xlsx), PowerPoint(.ppt/.pptx)等文件格式)
function didPressChooesMessageFile(that) {
// 详情请见demo部分 index.js
}
// 在线查看文件,支持的文件格式:pdf, doc, docx, xls, xlsx, ppt, pptx。关于wx.openDocument方法,详情请参考微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/file/wx.openDocument.html
function didPressViewFileOnline(that) {
// 详情请见demo部分 index.js
}
```
3. TypeScript 支持
```TypeScript
// 请先参照微信小程序开发文档配置 TypeScript 支持
import { upload } from 'qiniuUploader.ts';
Page({
didPressChooseImage: function() {
wx.chooseImage({
count: 1,
success: function (res) {
var filePath = res.tempFilePaths[0];
upload({
filePath: filePath,
options: {
key: '', // 可选
region: '', // 可选(默认为'ECN')
domain: '',
uptoken: '', // 以下三选一
uptokenURL: '',
uptokenFunc: () => {
return '[yourTokenString]';
},
shouldUseQiniuFileName: true // 默认true
},
before: () => {
// 上传前
console.log('before upload');
},
success: (res) => {
that.setData({
'imageObject': res
});
console.log('file url is: ' + res.fileUrl);
},
fail: (err) => {
console.log('error:' + err);
},
progress: (res) => {
console.log('上传进度', res.progress)
console.log('已经上传的数据长度', res.totalBytesSent)
console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend)
},
complete: (err) => {
// 上传结束
console.log('upload complete');
}
});
}
});
}
})
```
### DEMO
请使用微信web开发者工具打开 demo 文件夹,然后配置 index.js 中的相关参数以使用 demo。
### API
```javascript
var options = {
// bucket所在区域,这里是华北区。ECN, SCN, NCN, NA, ASG,分别对应七牛云的:华东,华南,华北,北美,新加坡 5 个区域
region: 'NCN',
// 获取uptoken方法三选一即可,执行优先级为:uptoken > uptokenURL > uptokenFunc。三选一,剩下两个置空。推荐使用uptokenURL,详情请见 README.md
// 由其他程序生成七牛云uptoken,然后直接写入uptoken
uptoken: '',
// 从指定 url 通过 HTTP GET 获取 uptoken,返回的格式必须是 json 且包含 uptoken 字段,例如: {"uptoken": "0MLvWPnyy..."}
uptokenURL: 'https://[yourserver.com]/api/uptoken',
// uptokenFunc 这个属性的值可以是一个用来生成uptoken的函数,详情请见 README.md
uptokenFunc: function () {
// do something
return qiniuUploadToken;
},
// bucket 外链域名,下载资源时用到。如果设置,会在 success callback 的 res 参数加上可以直接使用的 fileURL 字段。否则需要自己拼接
domain: 'http://[yourBucketId].bkt.clouddn.com',
// qiniuShouldUseQiniuFileName 如果是 true,则文件的 key 由 qiniu 服务器分配(全局去重)。如果是 false,则文件的 key 使用微信自动生成的 filename。出于初代sdk用户升级后兼容问题的考虑,默认是 false。
// 微信自动生成的 filename较长,导致fileURL较长。推荐使用{qiniuShouldUseQiniuFileName: true} + "通过fileURL下载文件时,自定义下载名" 的组合方式。
// 自定义上传key 需要两个条件:1. 此处shouldUseQiniuFileName值为false。 2. 通过修改qiniuUploader.upload方法传入的options参数,可以进行自定义key。(请不要直接在sdk中修改options参数,修改方法请见demo的index.js)
// 通过fileURL下载文件时,文件自定义下载名,请参考:七牛云“对象存储 > 产品手册 > 下载资源 > 下载设置 > 自定义资源下载名”(https://developer.qiniu.com/kodo/manual/1659/download-setting)。本sdk在README.md的"常见问题"板块中,有"通过fileURL下载文件时,自定义下载名"使用样例。
shouldUseQiniuFileName: false
};
// 图片上传(从相册)方法
function didPressChooesImage(that) {
// 详情请见demo部分 index.js
}
// 文件上传(从客户端会话)方法,支持图片、视频、其余文件 (PDF(.pdf), Word(.doc/.docx), Excel(.xls/.xlsx), PowerPoint(.ppt/.pptx)等文件格式)
function didPressChooesMessageFile(that) {
// 详情请见demo部分 index.js
}
// 在线查看文件,支持的文件格式:pdf, doc, docx, xls, xlsx, ppt, pptx。关于wx.openDocument方法,详情请参考微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/file/wx.openDocument.html
function didPressViewFileOnline(that) {
// 详情请见demo部分 index.js
}
```
### 说明
1. 对于存储空间的存储区域,[创建存储空间](https://portal.qiniu.com/bucket/create)的时候可以选择。
1. 当前一共有 5 个区域可以选择:[华东,华北,华南,北美,新加坡],对应着不同的服务器地址
2. 如果你不知道在哪里看当前空间的存储区域,可以登录七牛后台,在[这个页面的右下角](https://portal.qiniu.com/bucket)查看
3. **对于存储区域和 options 中 region 代码可以参考[这个表格](#region)**
2. SDK 依赖 uptoken,可以直接设置 `uptoken` 、通过提供 Ajax 请求地址 `uptokenURL` 或者通过提供一个能够返回 uptoken 的函数 `uptokenFunc` 实现。
```javascript
var options = {
// bucket所在区域,这里是华北区。ECN, SCN, NCN, NA, ASG,分别对应七牛云的:华东,华南,华北,北美,新加坡 5 个区域
region: 'NCN',
// 获取uptoken方法三选一即可,执行优先级为:uptoken > uptokenURL > uptokenFunc。三选一,剩下两个置空。推荐使用uptokenURL,详情请见 README.md
// 由其他程序生成七牛云uptoken,然后直接写入uptoken
uptoken: '',
// 从指定 url 通过 HTTP GET 获取 uptoken,返回的格式必须是 json 且包含 uptoken 字段,例如: {"uptoken": "0MLvWPnyy..."}
uptokenURL: 'https://[yourserver.com]/api/uptoken',
// uptokenFunc 这个属性的值可以是一个用来生成uptoken的函数,详情请见 README.md
uptokenFunc: function () {
// do something
return qiniuUploadToken;
},
// bucket 外链域名,下载资源时用到。如果设置,会在 success callback 的 res 参数加上可以直接使用的 fileURL 字段。否则需要自己拼接
domain: 'http://[yourBucketId].bkt.clouddn.com',
// qiniuShouldUseQiniuFileName 如果是 true,则文件的 key 由 qiniu 服务器分配(全局去重)。如果是 false,则文件的 key 使用微信自动生成的 filename。出于初代sdk用户升级后兼容问题的考虑,默认是 false。
// 微信自动生成的 filename较长,导致fileURL较长。推荐使用{qiniuShouldUseQiniuFileName: true} + "通过fileURL下载文件时,自定义下载名" 的组合方式。
// 自定义上传key 需要两个条件:1. 此处shouldUseQiniuFileName值为false。 2. 通过修改qiniuUploader.upload方法传入的options参数,可以进行自定义key。(请不要直接在sdk中修改options参数,修改方法请见demo的index.js)
// 通过fileURL下载文件时,文件自定义下载名,请参考:七牛云“对象存储 > 产品手册 > 下载资源 > 下载设置 > 自定义资源下载名”(https://developer.qiniu.com/kodo/manual/1659/download-setting)。本sdk在README.md的"常见问题"板块中,有"通过fileURL下载文件时,自定义下载名"使用样例。
shouldUseQiniuFileName: false
};
```
3. 如果您想了解更多七牛的上传策略,建议您仔细阅读 [七牛官方文档-上传](http://developer.qiniu.com/code/v6/api/kodo-api/index.html#up)。
七牛的上传策略是在后端服务指定的。
例如:[七牛云 java sdk](https://developer.qiniu.com/kodo/sdk/1239/java) 中提到了[魔法变量](https://developer.qiniu.com/kodo/manual/1235/vars#magicvar) 可以指定上传文件后,返回对象中包含字段:文件的大小 ``fsize`` , 文件类型 ``mimeType`` 等。
4. 如果您想了解更多七牛的图片处理,建议您仔细阅读 [七牛官方文档-图片处理](http://developer.qiniu.com/code/v6/api/kodo-api/index.html#image)
5. SDK 示例生成 uptotken 时,指定的 `Bucket Name` 为公开空间,所以可以公开访问上传成功后的资源。若您生成 uptoken 时,指定的 `Bucket Name` 为私有空间,那您还需要在服务端进行额外的处理才能访问您上传的资源。具体参见[下载凭证](http://developer.qiniu.com/article/developer/security/download-token.html)。SDK 数据处理部分功能不适用于私有空间。
### 常见问题
1. **关于上传key**
如果在上传的时候没有指定文件 key,会使用 ``wx.chooesImage`` 得到的 tmp filePath 作为文件的 key。例如:`tmp_xxxxxxx.jpg`。
或者,可以使用由 qiniu 服务器分配的 key (全局去重)。例如:`` Fh6qfpY...`` (建议的方式)
微信自动生成的 filename较长,导致fileURL较长。推荐使用{qiniuShouldUseQiniuFileName: true} + "通过fileURL下载文件时,自定义下载名" 的组合方式。
详情请见demo的 ``index.js`` 中的 ``shouldUseQiniuFileName`` 属性,sdk中的 ``qiniuShouldUseQiniuFileName`` 属性。
2. **设置取消上传、暂停上传:**
请见demo部分,``index.js``中``data.cancelTask``。sdk的``qiniuUploader.js``中的``cancelTask``方法。
此外,demo页面有中断上传的UI演示。
3. **限制上传文件的类型:**
支持图片文件、视频文件、其它文件(PDF(.pdf), Word(.doc/.docx), Excel(.xls/.xlsx), PowerPoint(.ppt/.pptx)等文件格式)。
demo部分的 ``index.wxml`` 页面有图片上传(从相册)、文件上传(从客户端会话)的UI演示。
4. **通过fileURL下载文件时,自定义下载名**
请参考:七牛云“对象存储 > 产品手册 > 下载资源 > 下载设置 > 自定义资源下载名”(https://developer.qiniu.com/kodo/manual/1659/download-setting)
例如:fileUrl为 ``http://xxx.com/keyyyyy``,直接在浏览器中打开此链接下载的文件,文件名为“keyyyyy”。
想自定义下载得到的文件名为“myName”,可以通过:``http://xxx.com/keyyyyy?attname=myName`` 来下载,即 "fileUrl" + "?attname=" + "自定义文件名" 的方式。
### 贡献代码
1. 登录 https://github.com
2. Fork `git@github.com:gpake/qiniu-wxapp-sdk.git`
3. 创建您的特性分支 (git checkout -b new-feature)
4. 提交您的改动 (git commit -am 'Added some features or fixed a bug')
5. 将您的改动记录提交到远程 git 仓库 (git push origin new-feature)
6. 然后到 github 网站的该 git 远程仓库的 new-feature 分支下发起 Pull Request
### 基于 GPL V3 协议发布:
> [GPL V3 LICENSE](https://github.com/gpake/qiniu-wxapp-sdk/blob/master/LICENSE)