uniapp视频文件分片上传(使用插件)

只适用于安卓

html部分使用插件

<uni-file-picker file-mediatype="video" mode="grid" :auto-upload="false"
 file-extname="mp4,m4v,avi" :limit="3" @select="select" />

使用Forke-FileSpliter插件进行分片上传

select(e){
    const FileSpliter = uni.requireNativePlugin('Forke-FileSpliter');
    let tempFilePath=e.tempFilePaths[0]
    let fileinfo=e.tempFiles[0]
    console.log(fileinfo,"fileinfo")
    let fromdata={
        "hashCode": Number(Math.random().toString().substr(5, 10) + Date.now()).toString(36),
        "fileName": fileinfo.name,
        "suffix": fileinfo.extname, //文件后缀
        'size':fileinfo.size, //文件大小
        'shardSize': this.sliceSize, //分片大小 1024*1024*1为1m
        'shardTotal': Math.ceil(fileinfo.size/this.sliceSize), //分片次数  
    }
    plus.io.resolveLocalFileSystemURL(tempFilePath, (entry) => {
        entry.file((file) => {
            console.log(file,"file")
            FileSpliter.splitFile({
                filePath: file.fullPath, //选择文件的完整路径,例如"/storage/0/..."
                savePath: plus.io.convertLocalFileSystemURL("_doc/FileSpliter"), //保存文件的完整路径,需要该路径存在, 例如"/storage/0/..."
                fileName: file.name, //"文件名"  
                chunkSize: this.sliceSize,  //每一片的大小, 例如 1024 * 1024 * 10  代表10MB
            }, (ret) => {
                console.log(ret,"reet")
                //成功的回调
                if (ret) {
                    if (ret.code == 'process') {
                        console.log("name", ret.name); //分片的所属文件名,用于区分多文件同时切片
                        console.log("path", ret.path);  //分片的绝对路径
                        console.log("chunk", ret.chunk); //分片序号
                        this.upload(fromdata,ret)
                    } else if (ret.code == 'complete') {
                        console.log("切片完成",ret);
                        this.deleteFiles(file.name)
                    } else if (ret.code == 'start') {
                        console.log("切片开始");
                    }
                }
            }, (ret) => {
                //失败的回调
            });
        })
    })
},
upload(fromdata,ret){
    console.log(fromdata,"fromdata")
    uni.uploadFile({
        url: this.$store.state.baseUrl + 'gcaq/common/file/bigFile/upload',
        filePath: ret.path, //切片返回的路径
        name: 'file',
        header: {
            "Authorization": this.$store.state.token
        },
        formData: {
           "hashCode": fromdata.hashCode,
           "fileName":  fromdata.fileName,
           "suffix":  fromdata.suffix, //这个需要自己根据文件总大小计算
           'size': fromdata.size, //文件大小
           'shardIndex': ret.chunk, //分片序号
           'shardSize': this.sliceSize, //分片大小
           'shardTotal': fromdata.shardTotal, //分片次数  
        },
        success: (uploadFileRes) => {
            console.log(uploadFileRes.data,"testttrt");
        }
    });
},
deleteFiles(fileName){
    const FileSpliter = uni.requireNativePlugin('Forke-FileSpliter');
    FileSpliter.clearFilePath({
            savePath: plus.io.convertLocalFileSystemURL("_doc/FileSpliter"),
            fileName: fileName
        }, (ret) => {
            if (ret) {
                if (ret.code == 'complete') {
                    console.log("切片目录已清空");
                }
            }
        }, (ret) => {
    
        });
},

使用KJ-FileSlice插件进行分片上传(此插件收费,使用自定义基座调试成功)

selectFn(e){
    var _this = this;
    let tempFilePath=e.tempFilePaths[0]
    let name=e.tempFiles[0].name
    let filename=name.substring(0, name.lastIndexOf("."))
    let extname=e.tempFiles[0].extname
    let size=e.tempFiles[0].size
    console.log(extname)
    if (tempFilePath.indexOf("_doc") != -1) {
        tempFilePath = plus.io.convertLocalFileSystemURL(tempFilePath);
    } else {
        tempFilePath = tempFilePath.replace("file://", "");
    }
    const KJFileSlice = uni.requireNativePlugin('KJ-FileSlice');
    var dic = {
        "pathFileName": tempFilePath,
        "savePath": plus.io.convertLocalFileSystemURL("_doc/KJ-FileSlice"), //保存切片地址,一定要是_doc目录
        "sliceSize": this.sliceSize, //切片大小,单位(B)
        "sliceSuffixName": "" //保存切片的后缀名 
    }
    KJFileSlice.start(dic, (res) => {
        console.log("start全部切片完成: " + JSON.stringify(res));
        this.uploadFn(JSON.parse(JSON.stringify(res)),filename,extname,size)
        if (res.error.length > 0) {
            console.log("切片错误:" + res.error);
        }
        _this.json = JSON.stringify(res);
    }, (res) => {
        console.log("start单个切片: " + JSON.stringify(res));
        if (res.error.length > 0) {
            console.log("切片错误:" + res.error);
        }
        if (res.isFinish) {
            console.log("切片结束");
        }
        _this.json = JSON.stringify(res);
    });
},
uploadFn(obj,name,extname,size){
    let arr=obj.slices
    this.arr=obj
    let num=0
    for (var index = 0;index < arr.length; index++) {
        let item=arr[index]
        uni.uploadFile({
            url:this.$store.state.baseUrl + 'gcaq/common/file/bigFile/upload',
            filePath: item.filePath, //切片返回的路径
            name: 'file',
            header: {
                "Authorization": this.$store.state.token
            },
            formData: {
                "hashCode": Number(Math.random().toString().substr(5, 10) + Date.now()).toString(36),
                "fileName": name,
                "suffix": extname, //后缀
                'size':size, //文件大小
                'shardIndex': index, //分片序号
                'shardSize': this.sliceSize, //分片大小 1024*1024*1为1m
                'shardTotal': arr.length, //分片次数  
            },
            success: (uploadFileRes) => {
                console.log(uploadFileRes.data,"uploadFileRes.data");
                num++
                console.log(num,"num")
                if(num==arr.length){
                    setTimeout(()=>{
                        this.deleteSliceData()
                    },1000)
                }
            }
        });
    }
},
deleteSliceData() {
    var dirPath = '_doc/KJ-FileSlice';
    plus.io.resolveLocalFileSystemURL(dirPath, function(entry) {
        //读取这个目录对象    
        var directoryReader = entry.createReader();
        //读取这个目录下的所有文件    
        directoryReader.readEntries(function(entries) {
            console.log(entries.length)
            //如果有才操作    
            if (entries.length > 0) {
                //删除目录将会删除其下的所有文件及子目录 不能删除根目录,如果操作删除根目录  
                //将会删除目录下的文件及子目录,不会删除根目录自身。 删除目录成功通过succesCB  
                //回调返回,失败则通过errorCB返回。  
                entry.removeRecursively(function(entry) {
                    console.log('删除成功回调')
                }, function(e) {
                    console.log(e.message + ' ?!');
                })
            }
        }, function(e) {
            console.log('读取文件失败:' + e.message)
        })
    }, function(e) {
        console.log('读取目录失败:' + e.message)
    })
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值