New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

power-uploader

Package Overview
Dependencies
Maintainers
1
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

power-uploader

power-uploader is powerfull

latest
Source
npmnpm
Version
0.4.2
Version published
Maintainers
1
Created
Source

文件传输SDK文档

引入方式

建议使用ES6引入。

import {Uploader, FileStatus} from 'power-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: false
});

初始化参数

参数名数据类型默认值说明
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点击区域的选择器
pickDirStringvoid 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:文件路径
  • uploadGroupId:文件组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
  • beforeFilesSourceQueued: 选择上传一组文件之前 包含目录源信息 @return Object { filesSource, actionType, uploadGroupId } demo

    uploader.on('beforeFilesSourceQueued', (obj) => {
        let {filesSource, actionType, uploadGroupId} = obj;
        if (actionType === 'pickDir') {
            // 选择的是文件夹
        }
        // 超过10个文件不允许上传
        if (filesSource.length > 10) {
            return false;
        }
    });
    
  • filesSourceQueued: 选择上传一组文件之后 文件源信息 @return Object { filesSource, actionType, uploadGroupId } demo

    uploader.on('filesSourceQueued', (obj) => {
        let {filesSource, actionType, uploadGroupId} = obj;
        if (actionType === 'pickDir') {
            // 选择的是文件夹
        }
    });
    
  • 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, config } = obj;
    
        config.headers = {
            'name': file.name,
            'path': '/person/img'
        };
        config.server = 'http://xxx.com/file/upload';
    });
    
  • 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)
        });
    });
    
  • fileMd5Finished:上传进度回调。

    @return Object { file, md5 }

    demo

    uploader.on('fileMd5Finished', async (obj) => {
        let {file, md5} = obj;
        let res = await api.md5Check(md5);
        if (res.ok === true) {
            file.url = res.url;
            file.loaded = file.size;
            file.statusText = FileStatus.COMPLETE;
            render(file); // 渲染文件
            return Uploader.CONSTANTS.MD5_HAS;
        }
    });
    
  • 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], responseText[String], responseTextArr[Array] }

    demo

    uploader.on('uploadSuccess', (obj) => {
        console.log('uploadSuccess');
        let { file, currendShard, shardCount, shard, responseText, responseTextArr } = obj;
        
        if (shardCount === 1) {
             // use responseText
        } else {
            // use responseTextArr
        }
    
        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] }

文件夹相关的事件:

  • beforeChildFileQueued:文件夹中的子文件入队列之前 @return Object { fileSource, parentEntry, uploadGroupId, actionType }

  • childFileQueued:文件夹中的子文件入队列之后 @return Object { fileSource, parentEntry, uploadGroupId, actionType }

  • beforeChildDirQueued:文件夹中的子文件夹入队列之前 @return Object { currentEntry, parentEntry, uploadGroupId, actionType }

  • childDirQueued:文件夹中的子文件夹入队列之后 @return Object { currentEntry, parentEntry, uploadGroupId, actionType }

  • selectDir:选择了文件夹,参数返回entry信息,通过return false; 可以禁止 @return Object { entry, uploadGroupId, actionType }

FAQs

Package last updated on 08 Jun 2018

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts