Cordova - 使用filepath插件将文件content://路径转换成file://路径
作者:hangge | 2022-05-19 08:27
我在之前文章中介绍了如何使用 multiple documents picker 插件来调用系统自带文件管理器进行文件选择(点击查看)。但是如果 Android 版本 >= 4.4,由于引入了 MediaStore,文件管理器选择文件后返回的是 content://xxx 这种格式的内容路径:
(2)效果图如下:


但有时我们需要的是 file://xxxx 这样的文件路径,比如:调用 file 插件读取文件内容,就必须使用使用这种以 file:// 开头的绝对文件路径。这种情况我们便可借助本文介绍的 filepath 插件通过 content 路径获取对应的 file 路径,下面通过样例进行演示。
1,添加插件
我们要在“终端”中进入工程所在的目录,然后运行如下命令安装插件:
cordova plugin add cordova-plugin-filepath
2,使用样例
(1)下面样例代码,点击页面上的“读取文件”按钮后,会先使用 multiple documents picker 插件选择文件,然后通过 filepath 获取以 file:// 开头的绝对文件路径,最后在使用 file 插件读取文件内容并显示在页面上。
关于 multiple documents picker 插件与 file 插件更详细的用法,可以查看我之前的文章:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Hello World</title>
<script src="cordova.js"></script>
<script>
// 选择文件
function selectFile() {
//2表示选择所有文件,1表示只选择图片
multipleDocumentsPicker.pick(2, function(files) {
let fileArray = JSON.parse(files);
if(fileArray.length > 0) {
document.getElementById("result").innerHTML = "文件选择完毕!路径为:"+fileArray[0].uri;
getFilePath(fileArray[0].uri);
}
}, function(error) {
document.getElementById("result").innerHTML = "文件选择失败:"+ error;
});
}
// 获取file://路径
function getFilePath(contentPath) {
document.getElementById("result").innerHTML += contentPath;
// 通过content:// 路径获取对应的 file://路径
window.FilePath.resolveNativePath(contentPath, function(finalPath) {
document.getElementById("result").innerHTML += "<br><br>对应的文件路径为:"+finalPath;
// 获取对应的 fileEntry 并读取文件
window.resolveLocalFileSystemURL(finalPath, readFile, console.log);
}, function(error) {
console.log(error);
});
}
//读取文件
function readFile(fileEntry) {
fileEntry.file(function (file) {
var reader = new FileReader();
reader.onloadend = function() {
document.getElementById("result").innerHTML += "<br><br>文件内容为:"+this.result;
};
reader.readAsText(file);
}, function() {
document.getElementById("result").innerHTML += "文件读取失败!";
});
}
</script>
</head>
<body>
<button style="font-size:23px;" onclick="selectFile()">读取文件</button>
<div id="result" style="word-break: break-all;"></div>
</body>
</html>
(2)效果图如下:

全部评论(0)