uniapp app端 文件处理 总结

1,233 阅读3分钟

keyword

  • 下载文件到本地
  • 解压zip包
  • 访问本地资源,比如png,video
  • 判断路径是否存在

下载文件到本地

参考文献

  1. 使用uniapp自带的uni.downloadFile和uni.saveFile API进行下载
saveFile() {
	return new Promise((resolve, reject) => {
		uni.downloadFile({
			url: filePath, // 下载的文件路径 网络资源路径等
			success: res => {
				const {
					tempFilePath // 获取下载的文件临时路径进行保存
				} = res
				console.log(tempFilePath, 'downloadFilePath')
				uni.saveFile({
					tempFilePath, // 保存到本地
					success({
						savedFilePath
					}) {
						console.log(savedFilePath, 'savedFilePath')
						resolve(savedFilePath)
					}
				})
			}
		})
	})
}

注意

saveFile保存的位置不能指定,uniapp会保存至

“内部存储\Android\data\io.dcloud.HBuilder\apps\HBuilder\doc\uniapp_save” 中,建议使用方法2

  1. 使用plus的方法进行下载 todo
uni.showLoading({
title: '正在下载'
});
// 本地路径开头使用file://,跟上手机文件本地目录storage/emulated/0,
// 这时用户文件管理器能看到的了,之后创建 连信 作为文件夹,
// 后缀是用于文件命名和格式修改,大家可以使用变量。
var url = this.downFileSrc;
let dtask = plus.downloader.createDownload(url, {
	filename: "file://storage/emulated/0/连信/" + this.downFileName //利用保存路径,实现下载文件的重命名
},(d, status)=> {
	//d为下载的文件对象
	if (status == 200) {
		uni.hideLoading();
		uni.showToast({
			icon: 'none',
			mask: true,
			title: '已保存到文件夹:/连信/' + this.downFileName, //保存路径
			duration: 3000,
		});
		//下载成功,d.filename是文件在保存在本地的相对路径,使用下面的API可转为平台绝对路径
		let fileSaveUrl = plus.io.convertLocalFileSystemURL(d.filename);
		setTimeout(()=>{
			plus.runtime.openFile(d.filename); //选择软件打开文件
		},1500)
	} else {
		//下载失败
		uni.hideLoading();
		plus.downloader.clear(); //清除下载任务
		uni.showToast({
			icon:'none',
			mask:true,
			title: '下载失败,请稍后重试',
		});
	}
})
dtask.start();

该方法可以自定义文件夹 可控性高

解压zip包

使用plus.zip对象进行zip包的操作

decompressZip() {
			const zipPath = 'zip包的路径 可通过上面的下载方法saveFile获取'
				console.log('zipPath', zipPath)
				// 第二个参数为保存的路径,我传入这个是uniapp 私有文件夹,可传入本地绝对路径
				plus.zip.decompress(zipPath, '_doc/zip/', (res) => {
					console.log('Zip Success', res)
				}, (err) => {
					console.log('Zip Error', err)
				})
	},

访问本地资源,比如png,video

  1. 访问uniapp 私有文件

使用plus.io.convertLocalFileSystemURL将比如uniapp私有文件夹(_doc*, _*www等)转成绝对路径,再搭配file:///进行访问

formatImageUrl() {
		// var p = plus.io.convertLocalFileSystemURL('_doc/dir/wallhaven-we1oyp.png');
		var p = plus.io.convertLocalFileSystemURL('_doc/dir/test.mp4');
		console.log(p, 'p')
		return 'file:///' + p;
	},

注意 该方法是将本地路径转为系统路径,不支持将绝对路径转成绝对路径

  1. 访问文件管理器绝对路径
formatImageUrl() {
		// var p = plus.io.convertLocalFileSystemURL('_doc/dir/wallhaven-we1oyp.png');
		const fileManagerPath = '/storage/emulated/0'// 通用,安卓文件管理器路径开头
		var p = fileManagerPath + '/test/test.mp4' // 加上绝对地址
		console.log(p, 'p')
		return 'file:///' + p;
	},
  1. 读取本地txt或json内容

传入的filePath需要为绝对路径,可通过上面的相对路径转绝对路径的方法或者绝对路径的获取方式进行使用

readFile(filePath) {
	const fileInputStream = plus.android.newObject("java.io.FileInputStream", filePath);
	const inputStreamReader = plus.android.newObject("java.io.InputStreamReader", fileInputStream, 'UTF-8');
	const bufferedReader = plus.android.newObject("java.io.BufferedReader", inputStreamReader);
	let str = ' ';
	let temp = ' ';
	while ((temp = plus.android.invoke(bufferedReader, 'readLine')) != null) {
		str += temp;
	}
	plus.android.invoke(bufferedReader, 'close');
	return str;
}

判断路径是否存在

// 获取路径是否存在 根据uniapp应用路径
export const getFileExistByLocalUrl = (path: string):boolean => {
	const systemUrl = plus.io.convertLocalFileSystemURL(path)
	return getFileExistBySystemUrl(systemUrl)
}

// 获取路径是否存在 需要传入绝对路径
export const getFileExistBySystemUrl = (path : string) : boolean => {
	const File = plus.android.importClass('java.io.File');
	let file = new File(path);	
	return file.exists()
}
注意事项:

1在manifest.js文件的 "permissions" 中添加 "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>".

2手机APP的存储权限一定要打开.