思路如下
1.获取大文件的临时目录tempFilePath
- tempFilePath转应用的安全路径safePath
- 根据大文件的size和每片大小进行分片,得到每个分片的base64
4.直接把每片的base64上传到后端,让后端处理
5.删除安全路径的文件
具体方法如下
2.tempFilePath转应用的安全路径safePath
let rootDir = await this.getDbFolder();
let safePath = rootDir.fullPath + filename;
let existFlag = await this.checkFileExists(filename);
if (!existFlag){
//复制到安全路径下
safePath = await this.copyToSafePath(tempFilePath, rootDir,filename);
}
async getDbFolder() { // 返回doc的应用私有目录对象,用于文件copy接口使用
return new Promise((resolve, reject) => {
plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
resolve(fs.root)
});
});
},
async checkFileExists(fileName) {
return new Promise((resolve) => {
plus.io.requestFileSystem(plus.io.PRIVATE_DOC, (fs) => {
fs.root.getFile(fileName, { create: false },
() => resolve(true), // 文件存在
() => resolve(false) // 文件不存在
);
});
});
},
async copyToSafePath(tempFilePath, rootDir,filename) {
return new Promise((resolve, reject) => {
// 使用plus.io读取文件
plus.io.resolveLocalFileSystemURL(tempFilePath, (entry) => {
entry.copyTo(rootDir,filename,function (res){
console.log("视频复制成功:" + res.fullPath);
resolve(res.fullPath);
},function (e){
console.log("视频复制成功:" ,e);
reject(e);
})
});
});
},
- 根据大文件的size和每片大小进行分片,得到每个分片的base64
for (let i = 0; i < totalChunks; i++) {
const start = i * chunkSize;
const length = Math.min(size - start, chunkSize); // 实际读取长度
// 读取分片base64
const chunkBase64 = await this.readFileChunk(safePath, start, length);
....
/**
* 获取分片的base64
*/
readFileChunk(safePath, start, length) {
return new Promise((resolve, reject) => {
// 使用plus.io读取文件
plus.io.resolveLocalFileSystemURL(safePath, (entry) => {
entry.file((file) => {
const reader = new plus.io.FileReader();
// 设置读取成功回调
reader.onloadend = (e)=> {
let base64 = e.target.result;
resolve(base64);
};
// 设置读取错误回调
reader.onerror = function(error) {
console.error('读取文件分片失败:', error);
reject(error);
};
// 截取文件片段并读取 slice是左右都会取到的,所以要减1
const fileSlice = file.slice(start, start + length - 1);
reader.readAsDataURL(fileSlice);
}, (error) => {
console.error('获取文件对象失败:', error);
reject(error);
});
}, (error) => {
console.error('解析文件路径失败:', error);
reject(error);
});
});
},
5.删除安全路径的文件
removeSafePath(safePath) {
uni.removeSavedFile({
filePath: safePath,
success: (res) => {
console.log('文件删除成功', safePath);
},
fail: (err) => {
console.error('文件删除失败', err);
}
});
},
0 个评论
要回复文章请先登录或注册