只适用于安卓
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)
})
}