uni_android_plugin_project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

253 lines
8.0 KiB

import downloadImg from "./download.js"
/*
*V1.0
*基于5+ IO 封装的基础文件操作库 业务函数 为人脸识别操作提供文件处理功能
*使用范围:(7in,8in)Android 11 Pad
*更新日期:2022/06/09
*/
/*
fileName: 需要查询的目录名
*/
async function getFileChildrenList(fileName){
let fs = await downloadImg.requestFileSystem(plus.io.PUBLIC_DOWNLOADS); //获取所要操作根目录File System
let faceSyncEntry = await downloadImg.getDirectory({
//在PUBLIC_DOWNLOADS下定义人脸库同步文件夹"Face-Sync" Success-Import
OriginPathEntry: fs.root,
newFileName: fileName
});
return downloadImg.getFileChildrenList(faceSyncEntry).then((res)=>{
return res
}).catch((e)=>{
console.log("获取文件列表失败:",e)
})
}
/*
fileName: 需要删除的文件名
*/
async function deleteAndroidFaceImage(fileName){
console.log("deleteAndroidFaceImage:",fileName)
let item = {
"deleteFile" : true,
"name": fileName
}
let fs = await downloadImg.requestFileSystem(plus.io.PUBLIC_DOWNLOADS); //获取所要操作根目录File System
let url = item.url; //测试url---------
let newName = item.name;
let faceSyncEntry = await downloadImg.getDirectory({
//在PUBLIC_DOWNLOADS下定义人脸库同步文件夹"Face-Sync" Success-Import
OriginPathEntry: fs.root,
newFileName: 'Face-Sync'
});
let newNameFileEntry = await downloadImg.resolveLocalFileSystemURL(faceSyncEntry.fullPath + newName).catch(e => {
console.log('目标文件可以操作', e);
});
if (newNameFileEntry) {
console.log('存在缓存的同名文件:', newNameFileEntry.fullPath);
if(item.deleteFile){
let delResult = await downloadImg.removeFile(newNameFileEntry); //删除已存在的文件
console.log("删除同名文件结果:",delResult)
return delResult
}
if(item.forceDownload){//当本地存在缓存时,是否强制删除后重新下载
let delResult = await downloadImg.removeFile(newNameFileEntry); //删除已存在的文件
}else{
return newNameFileEntry.fullPath //返回已缓存文件路径
}
}else{
console.log("不存在同名文件:"+fileName)
}
}
/*
直接处理接口数据,下载列表并返回下载结果
并同时处理request_time,检测确保当完成列表下载后,本地再存储request_time
*/
async function downloadFileList(res){
// await asyncSetTimeOut(3000) //延时,手动断网,模拟下载失败
let clearUNI = await clearUniDownloadFace();
console.log("清空doc结果:",clearUNI)
return new Promise(async(rs,rj)=>{
let {list,request_time,total} = res
console.log(request_time,total);
let downloadSuccessList = []
for (var i=0; i < list.length; i++) {
try{
await checkNetworkUsable()
console.log("当前第"+(i+1)+"张, 总需下载:"+(list.length))
let local_path = await downloadFileImg(list[i])
downloadSuccessList.push(local_path);
list[i]['local_path'] = local_path
}catch(e){
//TODO handle the exception
// util.showNone(e)
console.error("下载失败:",e);
list[i]['error'] = e
continue
}
}
res.list = list
checkRequestTime(res)
rs(list)
})
}
/*检测下载完成后列表,全部下载完成时,设置下载时间到本地
*/
function checkRequestTime(res){
if(res.list.every(e=>e.local_path)){
setRequestTime(res)
}
}
/*传入downloadFileList 结果,返回plugin要求的成功图片user_id拼接string
如: 15,17
*/
function getDataForPlugin(list){
return list.map(e=>{
if(e.local_path)return e.user_id
}).join(",")
}
/*检测当前网络是否可用
*/
function checkNetworkUsable(){
return new Promise((rs,rj)=>{
uni.getNetworkType({
success: function (res) {
console.log("checkNetworkUsable 当前可用网络:",res.networkType);
rs(true)
},
fail: function (err) {
console.log(err);
rj(false)
}
});
})
}
/*存储请求时间到本地
后台约定,人脸更新机制为带时间请求
*/
function setRequestTime(res){
if(res.request_time){
uni.setStorageSync("request_time",res.request_time)
}
}
/*返回请求时间戳
*/
function getRequestTime(){
return new Promise((rs,rj)=>{
let _time = ""
try{
_time = uni.getStorageSync("request_time")
}catch(e){
console.warn("请求时间戳异常:",e);
}
rs(_time)
})
}
async function asyncSetTimeOut(time){
const res = await new Promise(resolve => {
setTimeout(() => resolve("asyncSetTimeOut"), time||1000);
});
return res
}
/*
//下载文件,转存后,按user_id重命名,并返回最终文件本地路径.
//当有重复文件时,覆盖
item:{
pic_url:"",user_id:"",update_time:""
}
*/
async function downloadFileImg(item) {
let fs = await downloadImg.requestFileSystem(plus.io.PUBLIC_DOWNLOADS); //获取所要操作根目录File System
let url = item.pic_url; //测试url---------
let onProgresCallBack = function(e) {
//预留下载进度封装拓展
console.log('下载中...user_id:'+item.user_id, e);
};
let tempDownloadFilePath = await downloadImg.getDownloadFile({
url,
onProgresCallBack
}); //获取下载文件临时路径
let savedFilePath = await downloadImg.getSaveFile(tempDownloadFilePath); //将文件临时路径长久存储并清除
let newName = item.user_id + '.' + (savedFilePath.split('.')[1] ||
'jpg'); //命名与android约定的文件名: [user_id].jpg------------
newName = item.user_id + getName(url);
// console.log(tempDownloadFilePath, savedFilePath.split('.')[1], savedFilePath);
let savedFilePathEntry = await downloadImg.resolveLocalFileSystemURL(savedFilePath); //获取下载后存储的文件Entry
let faceSyncEntry = await downloadImg.getDirectory({
//在PUBLIC_DOWNLOADS下定义人脸库同步文件夹"Face-Sync"
OriginPathEntry: fs.root,
newFileName: 'Face-Sync'
});
let newNameFileEntry = await downloadImg.resolveLocalFileSystemURL(faceSyncEntry.fullPath + newName).catch(
e => {
console.log('目标文件可以操作', e);
});
if (newNameFileEntry) {
console.log('删除存在的同名文件:', newNameFileEntry.fullPath);
let delResult = await downloadImg.removeFile(newNameFileEntry); //删除已存在的文件
}
let reNamePathEntry = await downloadImg.moveFileTo(savedFilePathEntry, faceSyncEntry, newName); //重命名文件到人脸库同步文件夹
console.log("重命名后:",savedFilePath,newName,reNamePathEntry.fullPath)
return reNamePathEntry.fullPath;
}
function getName(url) {
let end = '.';
let urlarr = url.split('.');
let endname = urlarr[urlarr.length];
if (endname != 'jpg' || endname != 'png' || endname != 'jpeg' || endname != 'PNG' || endname != 'JPG' || endname != 'JPEG') endname = 'jpg';
return (end += endname);
}
//递归清空本地同步文件目录及子目录
async function clearDownloadFace(fileName){
let fs = await downloadImg.requestFileSystem(plus.io.PUBLIC_DOWNLOADS); //获取所要操作根目录File System
let faceSyncEntry = await downloadImg.getDirectory({
//在PUBLIC_DOWNLOADS下定义人脸库同步文件夹[fileName]
OriginPathEntry: fs.root,
newFileName: fileName
});
let newNameFileEntry = await downloadImg.resolveLocalFileSystemURL(faceSyncEntry.fullPath).catch(
e => {
console.log('操作目标文件', e);
});
await downloadImg.removeFileAll(newNameFileEntry).then(e=>{
console.log(fileName,"删除:",e);
})
}
//递归清空本地临时下载目录及子目录
async function clearUniDownloadFace(){
let fs = await downloadImg.requestFileSystem(plus.io.PRIVATE_DOC); //获取所要操作根目录File System
// let faceSyncEntry = await downloadImg.getDirectory({
// //在PUBLIC_DOWNLOADS下定义人脸库同步文件夹[fileName]
// OriginPathEntry: fs.root,
// newFileName: fileName
// });
// let newNameFileEntry = await downloadImg.resolveLocalFileSystemURL(faceSyncEntry.fullPath).catch(
// e => {
// console.log('操作目标文件', e);
// });
await downloadImg.removeFileAll(fs).then(e=>{
console.log("删除uni _Doc缓存文件:",e);
})
}
module.exports = {
downloadFileImg,
clearDownloadFace,
downloadFileList,
getRequestTime,
getDataForPlugin,
asyncSetTimeOut,
deleteAndroidFaceImage,
getFileChildrenList
}