2.4.0 • Published 6 months ago

big-file-up v2.4.0

Weekly downloads
-
License
ISC
Repository
-
Last release
6 months ago

简介

本工具支持多文件上传,多线程计算,切片并发上传,秒传,断点续传,暂停,修改上传优先级等功能,不含界面纯粹的文件上传插件。

  • 多文件上传:可传入多个文件
  • 文件分片:可设置分片大小,多线程自动计算md5值
  • 并发上传:可自由控制并发数量,默认3个
  • 秒传:用于检测服务器上是否拥有相同的文件,有则直接成功
  • 断点续传:可让后端根据计算的md5值返回之前已上传的文件,直接上传剩余文件即可
  • 暂停功能:可随时暂停或开启上传功能
  • 修改优先级:在并发量多余的情况下,优先级越高的上传速度越快,会自动分配并发量

版本更新内容

  • 2.3.2版本,增加联系方式
  • 2.3.1版本,增加演示地址查看
  • 2.3.0版本,修复插件多线程无法启动导致插件不能使用的问题
  • 支持传入多文件同时上传,同时上传数量有限制,防止浏览器压力过大等问题
  • 增加设置上传优先级功能
  • 修改开始或暂停一个的方法,需传入暂停文件对象
  • 增加开始或暂停全部上传功能
  • 将秒传验证从get方法改为post

插件使用演示

点击查看演示 账号:18306058718 密码:888888

联系方式

q:1805231651,有问题可联系我更改

使用方法

1.npm安装

npm i big-file-up

2.引入

import { BigFileUp } from "big-file-up";

3.视频切片使用示例

import { BigFileUp } from "big-file-up";
const inputDom = document.getElementById("chooseFile");
const stop = document.getElementById("stop");
const start = document.getElementById("start");
const stopAll = document.getElementById("stopAll");
const startAll = document.getElementById("startAll");
let fileList = [];
let bigFIleUp;
/**
 * 选择文件
 */
inputDom?.addEventListener("change", (res) => {
    const input: any = res.target
    fileList = Array.from(input.files)
    bigFIleUp = new BigFileUp({
        file:fileList,
        auto: true, //自动上传
        fast: true, //秒传
        checkUrl: '/Mymedia/upUserFile', //秒传验证接口
        upUrl: '/Mymedia/upUserFile', //上传分片文件接口
        mergeUrl: '/Mymedia/upUserFile?action=merge', //合并触发接口
        requestBefore:(...ags)=>{ // 请求体拦截器
            const url = ags[0];
            if(url === '/index/Mymedia/upUserFile'){
                const {chunkNumber, totalChunks, file, filename, totalSize, identifier } = ags[1]||{};
                const names = filename.split('.');
                // 构建表单
                const form = new FormData();
                form.append('file', file);
                form.append('filename', filename);
                form.append('totalChunks', totalChunks + '');
                form.append('ext', names[names.length-1]);
                form.append('chunkNumber', chunkNumber + '');
                form.append('totalSize', totalSize + '');
                form.append('identifier', identifier);
                return [url, form, ags[2]];
            }else{
                return ags;
            }
        },
        requestHeaders: { //请求头携带参数
            'user-id': 1,
            token: '',
        },
        change: (data) => { //变化监听
            console.log("状态或者进度改变了------", data)
            const { type, file} = data
            console.log("当前改变文件为:",file);
            if (type === 'state') { //状态改变
                console.log("当前状态为:" + data[type])
            } else { //进度改变
                console.log("当前进度比例为:" + data[type])
            }
        },
        success: ({file, url}) => { //上传成功触发函数
            console.log("当前上传成功文件为:",file)
            time = new Date().getTime() - time;
            console.log(time + "上传成功后返回的地址:" + url)
        },
        fail: ({file,message}) => { //上传错误触发函数
            console.log("当前失败文件为:",file)
            console.log("上传出错了:" + message);
        }
    })
    //设置第一个文件优先级为高
    bigFIleUp.setPriority([{file:fileList[0],priority:'high'}])
})
/**
 * 暂停
 */
stop?.addEventListener("click", () => {
    bigFIleUp.stop();
})
/**
 * 开始或者继续
 */
start?.addEventListener("click", () => {
    bigFIleUp.start();
})
/**
 * 全部暂停
 */
stopAll?.addEventListener("click", () => {
    bigFIleUp.stopAll();
})
/**
 * 全部开始
 */
startAll?.addEventListener("click", () => {
    bigFIleUp.startAll();
})

参数结构

参数说明类型可选值默认值
file需要上传的文件File--
auto是否自动触发上传Booleantrue/falsetrue
size分片大小,单位:Mnumber-2
fast是否开启秒传Booleantrue/falsefalse
checkUrl秒传验证地址string--
upUrl分片上传地址string--
mergeUrl合并地址string--
requestNum总的并发数number正整数3
requestHeaders请求头Record<string, any>--
success成功完成函数(data: { file: File, url: string }) => void--
fail报错触发函数(error: { file?: File, message: string }) => void--
response统一请求返回处理函数(response: any) => ResponseApi--
change状态或者进度变化(data: changeDataApi) => void--

方法说明

方法名称说明参数参数是否必传
start开始或者继续上传file:File
startAll全部开始--
stop暂停上传file:File
stopAll全部暂停--
setRequestHeaders设置请求头headers: Record<string, any>
setResponse设置返回拦截response: (data: any) => ResponseApi
setPriority设置上传优先级list:Array<{file: File, priority: priorityType}>

注意事项

秒传验证返回结构示例

{
    bool:true,
    msg:{
        isExist:true, //如果有此参数表示 有相同文件,直接成功
        uploaded:[1,2,7,8], //如果有此参数表示 分片后,第1、2、7、8片的文件是上传了的
    }
}

最终上传成功后的返回结构示例

{
    bool:true,
    msg:{
        filepath:"成功后的地址"
    }
}

返回统一处理函数替换

/**
 * 如返回的参数结构跟此插件不一致,需替换
 * 此插件统一返回结构主要为:{ bool:Boolean, msg:string|{[key:string]:any} }
 * bool:true为成功的返回,false:失败的返回,需要触发错误函数的
 * msg:错误返回这个就是错误的提示语
 */
/**
 * 下面是替换处理函数的示例
 * 如统一返回的结构为:{code:number, data:any, message:string}
 * code:0为成功,其他的为失败
 * data:数据
 * message:提示语
 */
//方法一 :
const bigFIleUp = new BigFileUp({
    ...,
    response:function(response: any){
        if(response.code === 0){ //正确的返回
            /**
             * response.data的参数结构需为:
             * {
             * filepath?: string,  成功后返回的文件地址
             * isExist?: Boolean,  是否检查到有同样的文件,直接秒传成功
             * uploaded?: Array<number>,  返回已成功上传的部分,如[1,2]代表第1、2片已被上传过
             * }
             */
            return response.data
        }else{ //错误的话直接触发错误函数
            this.error(response.message);
            return false;
        } 
    }
});
//方法二:
bigFIleUp.setResponse = (response: any)=>{
        if(response.code === 0){ //正确的返回
            /**
             * response.data的参数结构需为:
             * {
             * filepath?: string,  成功后返回的文件地址
             * isExist?: Boolean,  是否检查到有同样的文件,直接秒传成功
             * uploaded?: Array<number>,  返回已成功上传的部分,如[1,2]代表第1、2片已被上传过
             * }
             */
            return response.data
        }else{ //错误的话直接触发错误函数
            bigFIleUp.error(response.message);
            return false;
        } 
    }