更好用的七牛云存储 JS SDK,因为官方的太难用

码林珊瑚
• 阅读 6020

qiniu4js

qiniu4js目前可能是七牛JavaScript浏览器文件上传的最好实现。

使用TypeScript编写,不依赖任何三方库,纯代码不包含任何界面元素,使用HTML5 文件API上传(目前和未来不会支持HTML4以及FLASH)。

支持UMD模块导入。

已完成

  • [x] 文件直传

  • [x] 分块上传

  • [x] 多文件上传

  • [x] token共享

  • [x] 自动重传

  • [x] 任务拦截器

  • [x] 文件过滤

  • [x] 多实例(可以创建多个上传实例,互不影响)

待完成

  • [ ] 自定义变量

  • [ ] 图片裁剪

  • [ ] 图片质量压缩

  • [ ] 使用七牛API进行图片处理

安装

sudo npm install qiniu4js --save

导入

浏览器

    <script src="qiniu4js.js"></script>

es6

    import {UploaderBuilder} from 'Qiniu'

CommonJS

    {UploaderBuilder} =  require('Qiniu')

使用方法

//构建uploader实例
let uploader = new Qiniu.UploaderBuilder()
    .debug(false)//开启debug,默认false
    .domain("http://img.yourdomain.com")//默认为http://upload.qiniu.com
    .retry(0)//设置重传次数,默认0,不重传
    .size(1024*1024)//分片大小,最多为4MB,单位为字节,默认1MB
    .chunk(true)//是否分块上传,默认true,当chunk=true并且文件大于4MB才会进行分块上传
    .auto(true)//选中文件后立即上传,默认true
    .multiple(true)//是否支持多文件选中,默认true
    .accept(['.gif','.png','video/*'])//过滤文件,默认无,详细配置见http://www.w3schools.com/tags/att_input_accept.asp
    .tokenShare(true)//在一次上传队列中,是否分享token,如果为false每上传一个文件都需要请求一次Token,默认true
    .tokenFunc(function (setToken,task) {
        //token获取函数,token获取完成后,必须调用`setToken(token);`不然上传任务不会执行。
        setTimeout(function () {
            setToken("token");
        }, 1000);
    })
    //任务拦截器
    .interceptor({
        //拦截任务,返回true,任务将会从任务队列中剔除,不会被上传
        onIntercept: function (task) {
            return task.file.size > 1024 * 1024;
        },
        //中断任务,返回true,任务队列将会在这里中断,不会执行上传操作。
        onInterrupt: function (task) {
            if (this.onIntercept(task)) {
                alert("请上传小于1m的文件");
                return true;
            }
            else {
                return false;
            }
        },
    }   
    //你可以添加多个任务拦截器
    .interceptor({...})
    .listener({
        onReady(tasks) {
            //选择上传文件确定后,该生命周期函数会被回调。
            
        },onStart(tasks){
            //开始上传
            
        },onTaskGetKey(task){
            //为每一个上传的文件指定key,如果不指定则由七牛服务器自行处理
            return "test.png";
            
        },onTaskProgress: function (task) {
            //每一个任务的上传进度,通过`task.progress`获取
            console.log(task.progress);
            
        },onTaskSuccess(task){
            //一个任务上传成功后回调
            
        },onTaskFail(task) {
            //一个任务在经历重传后依然失败后回调此函数
            
        },onTaskRetry(task) {
            //开始重传
            
        },onFinish(tasks){
            //所有任务结束后回调,注意,结束不等于都成功,该函数会在所有HTTP上传请求响应后回调(包括重传请求)。
            
        }}
    }).build();
    
    
//如果auto设置为false,则需要手动启动上传。
//uploader.start();


//由于安全原因,display:none的file input,无法通过代码调用click方法,必须通过如下处理,让用户来实现click,从而打开文件选择窗口:

//你可以自行监听HTML元素的click事件,在回调函数内部打开文件选择窗口。你也可以使用jQuery监听,下面使用的是原生的JavaScript的方式。
button = document.getElementById('button');
button.addEventListener("click", function () {
    uploader.chooseFile();
}

版本说明

  • 0.0.9 (2016-10-21)

    • 分块上传,自定义上传域名

  • 0.0.8 (2016-10-19)

    • fix bug,当没有选中任何文件的时候,会触发上传函数。

  • 0.0.7 (2016-10-19)

    • 更换上传域名为upload.qiniu.com

  • 0.0.6 (2016-10-19)

    • 绕过缓存,避免每次都上传同样的文件。

  • 0.0.5 (2016-10-19)

    • tokenFunc(setToken,task)增加task参数

  • 0.0.4 (2016-10-19)

    • 修复了一个关于accept选项的bug。

  • 0.0.3 (2016-10-19)

    • 任务拦截器实现。

  • 0.0.2 (2016-10-19)

    • 基本功能的实现。

维护人

知乎 : @面条

Github : @lsxiao

开源许可

MIT

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
4年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这