0.1.20 • Published 6 years ago

neixin-uploader v0.1.20

Weekly downloads
2
License
ISC
Repository
github
Last release
6 years ago

此项目转移到 power-uploader https://www.npmjs.com/package/power-uploader

文件传输SDK文档

引入方式

建议使用ES6引入。

import {Uploader, FileStatus} from 'neixin-uploader';
  • Uploader:文件传输SDK的构造类
  • FileStatus:文件实例的状态
    • INITED:初始状态(beforeFileQueued事件之后就会变更)
    • QUEUED:已经进入队列, 等待上传
    • PROGRESS:上传中
    • ERROR:上传出错,可重试
    • CANCELLED:上传取消,会清出队列
    • INTERRUPT:上传中断,可续传
    • INVALID:文件不合格,不能重试上传

初始化

eg.

let uploader = new Uploader({
    pick: '.ff-wrap .up-btn',
    dnd: 'body, .dnd-area',
    paste: ['body', '.paste-area'],
    listenerContainer: document,
    body: document.body,
    chunked: true,
    chunkSize: 20971520,
    multiple: true,
    withCredentials: true
});

初始化参数

参数名数据类型默认值说明
timeoutNumber0超时时间,为0时不会设置超时事件
acceptArray[]{extensions: 'jpg', mimeTypes: 'image/*'}
autoBooleantrue是否得到文件后就上传,暂不支持设置为false
sameTimeUploadCountNumber3同时上传分片的个数
chunkedBooleanfalse是否开启分片上传
chunkSizeNumber20971520分片大小,默认是20MB
chunkRetryNumber2分片失败重试次数(不建议更改太大)
formDataObject{}除了二进制文件外,拓展的formData对象
headersObject{}自定义头
fileValString'file'formData二进制文件的key
methodString'post'请求方法
fileNumLimitNumberundefined暂不启用
fileSizeLimitNumberundefined暂不启用
fileSingleSizeLimitNumberundefined暂不启用
dndStringvoid 0拖拽区域选择器
pickStringvoid 0点击区域的选择器
pasteStringvoid 0粘贴区域选择器
serverString''服务器地址
listenerContainerDOMdocument事件委托的DOM元素
bodyDOMdocument.body动态创建的input插入到的DOM元素
multipleBooleanfalse是否可以选择多文件上传
withCredentialsBooleantrue是否开启跨域带cookie
setNameFunction(id) => new Date().getTime() + id无文件名文件函数
logFunctionconsole.log记录log的函数
logLevelNumber1暂时不开启使用

其中pickdndpaste填写选择器的时候支持Selector String,通过,分隔的Selector String,存放Selector String的数组。

file对象封装

file对象封装在事件回调函数中返回的参数对象里为filekey

  • eventEmitter:事件发射器
  • ext:文件后缀
  • id:文件唯一标识符,eg:WU_FILE_0
  • isFile:是否是文件(有可能是目录呢)
  • lastModifiedDate:最后修改时间
  • loaded:上传字节数
  • name:文件名
  • path:文件路径
  • selectFileTransactionId:文件组ID(可能吧)
  • size:文件大小(字节数)
  • source:原生文件对象
  • statusText:文件状态,即FileStatus的值
  • type:文件的MIME Type,egvideo/mp4

事件

所有的事件的回调函数返回的参数均是一个对象,参数中可能有的值说明

名称数据类型说明存在事件
fileObject即上面的file对象封装所有事件
currentShardNumber当前文件分片,从1开始计算,不是从0开始大部分事件
shardCountNumber文件总分片大部分事件
shardBlob分片的二进制对象,一般很少用到大部分事件
totalNumber文件的总字节数大部分事件
loadedNumber文件读取的字节数uploadProgress
isUploadEndBoolean文件是否传输完毕uploadProgress
responseTextString分片请求后的服务端返回uploadAccept
responseTextString分片请求后的服务端返回uploadAccept
errorError上传错误信息uploadError
  • beforeFileQueued:文件添加到上传队列之前,可以对文件进行一些过滤,return false;会阻止将该文件加入队列。

    @return Object { file }

    demo

    uploader.on('beforeFileQueued', (obj)=> {
        console.log('beforeFileQueued');
        let { file, setContentType } = obj;
        setContentType('image/png'); // 更改文件的Content-Type  
    
        if (/^[^<>\|\*\?\/]*$/.test(file.name)) {
            let b1 = new Buffer(file.name);
            let bytes = Array.prototype.slice.call(b1, 0);
            if (bytes.length > 128) {
                alert('字符长度过长');
                return false;
            }
        } else {
            alert('存在特殊字符');
            return false;
        }
    
        return true;
    });
  • fileQueued:没有被beforeFileQueued阻止,文件已经被添加进队列,等待上传。

    @return Object { file }

    demo

    uploader.on('fileQueued', (obj) => {
        console.log('fileQueued');
        let { file } = obj;
    
        this.setState({
            fileList: [...this.state.fileList, file]
        });
    });
  • uploadStart:该文件已经开始上传(第一片分片已经上传了)。

    @return Object { file }

    demo

    uploader.on('uploadStart', (obj)=> {
        console.log('uploadStart');
        let { file } = obj;
    
        // 开始请求的文件statusText属性会有变化
        let newFileList = this.state.fileList.map(fileItem =>
            file.id === fileItem.id ? file : fileItem );
        this.setState({ fileList: newFileList });
    });
  • uploadBeforeSend:每一个分片上传之前,可以修改new Uploader的时候传入的部分属性,如serverheaders

    @return Object { file, currentShard[Number], shardCount[Number], shard[Blob] }

    demo

    uploader.on('uploadBeforeSend', (obj)=> {
        console.log('uploadBeforeSend');
        let { file, currentShard, shard, shardCount } = obj;
    
        uploader.config.headers = {
            'cfp': encode(JSON.stringify({
                path: `/person/126222/测试/图片${new Date().getTime()}.jpg`
            }))
        };
        uploader.config.server = 'http://api.neixin.cn/pan/ul/6/storage/create.json';
    });
  • uploadProgress:上传进度回调。

    @return Object { file, loaded[Number], total[Number], shardLoaded[Number], shardTotal[Number] }

    其中loadedtotal是整体文件的,shardLoadedshardTotal是单个分片的,file.loaded已经是loaded的值。

    demo

    uploader.on('uploadProgress', (obj)=> {
        console.log('uploadProgress');
        let { file, loaded, total, shardLoaded, shardTotal } = obj;
    
        console.log(loaded / total * 100 + '%', file.loaded);
        this.setState({
            fileList: this.state.fileList.map(item => item.id === file.id ? file : item)
        });
    });
  • uploadAccept:分片上传成功。

    @return Object { file, shard[Blob], shardCount[Number], currentShard[Number], isUploadEnd[Boolean], responseText[String] }

    demo

    uploader.on('uploadAccept', async(obj)=> {
        console.log('uploadAccept');
        let { file, shard, shardCount, currentShard, isUploadEnd, responseText } = obj;
    });
  • uploadSuccess:文件上传成功。

    @return Object { file, currentShard[Number], shardCount[Number], shard[Blob] }

    demo

    uploader.on('uploadSuccess', (obj) => {
        console.log('uploadSuccess');
        let { file, currendShard, shardCount, shard } = obj;
    
        let newFileList = this.state.fileList.map(item => file.id === item.id ? file : item);
        this.setState({fileList: newFileList});
    });
  • uploadEndSend:文件上传结束,成功失败都会触发。

    uploadSuccess

  • uploadError:文件上传失败。

    @return Object { file, error[Error] }

文件夹相关的事件:

  • selectDir:选择了文件夹,参数返回entry信息,通过return false; 可以禁止
  • beforeChildFileQueued:文件夹中子文件进入队列,但是是假的,先不要用这个事件
  • beforeChildDirQueued:文件夹子中文件夹进入队列,但是是假的,先不要用这个事件
0.1.20

6 years ago

0.1.19

7 years ago

0.1.18

7 years ago

0.1.17

7 years ago

0.1.16

7 years ago

0.1.15

7 years ago

0.1.14

7 years ago

0.1.13

7 years ago

0.1.12

7 years ago

0.1.11

7 years ago

0.1.10

7 years ago

0.1.9

7 years ago

0.1.8

7 years ago

0.1.7

7 years ago

0.1.6

7 years ago

0.1.5

7 years ago

0.1.4

7 years ago

0.1.3

7 years ago

0.1.2

7 years ago

0.1.1

7 years ago

0.1.0

7 years ago