使用Cordova / PhoneGap 3.3.0,我使用FileTransfer插件下载文件,然后尝试使用InAppBrowser插件打开它。 我可以成功下载文件,并将其放在临时目录中。由于File插件现在使用URL模式,我无法弄清楚如何将正确的url /路径传递给InAppBrowser插件的window.open
方法。我也找不到任何相关文件。我能找到的所有“下载和打开”文档都已过时并且是URL前架构。
相关链接:
我发现过时的例子:
entry.fullPath
,现已弃用,toURL()
这是我的代码:
var uri = encodeURI("http://some.url/file.pdf");
window.requestFileSystem(LocalFileSystem.TEMPORARY, 0,
function (fileSystem) {
var fileTransfer = new FileTransfer();
var filename = fileSystem.root.toURL() + uri.substr(uri.lastIndexOf("/") + 1);
fileTransfer.download(uri, filename,
function(entry) { // download success
var path = entry.toURL(); //**THIS IS WHAT I NEED**
window.open(path, "_system");
},
function(error) {} // irrelevant download error
);
},
function(error) {} // irrelevant request fileSystem error
);
我目前正在使用Nexus 7和Nexus 5在Android上进行测试.InAppBrowser正确打开默认的pdf启动器(在我的情况下是Adobe Reader),但后来我收到“文档路径无效”错误。
[更新:显示返回值]
我为文件路径尝试了以下所有组合:
var path = entry.toURL(); // "cdvfile://localhost/temporary/file.pdf"
var path = entry.fullPath; // "file.pdf"
var path = fileSystem.root.toURL() + filename; // "cdvfile://localhost/temporary/file.pdf"
var path = fileSystem.root.fullPath + filename; // "/file.pdf"
答案 0 :(得分:6)
由于Cordova 3.4文件协议已更改,而不是使用fullPath,它们现在提供返回cdvfile://path/to/your/file.ext路径的toURL()。
因此,当您使用filesystem对象的回调(使用entry参数)下载文件时,只需调用entry.toURL()并使用以下语句打开它以打开它 - 假设您安装了InApBrowser并且_blank将打开InAppBrowser的窗口:
window.open(entry.toURL(), '_blank', 'location=no,closebuttoncaption=Close,enableViewportScale=yes');
我在博客上的this post写了这篇文章(如果你想要所有的参考资料和背景信息)。
答案 1 :(得分:4)
我认为我有一个解决方案,但它有点讨厌。
我通过cordova JAVA进行了搜索,并查找了构建文件入口JSON对象的位置。特别是通过查找将fullPath
添加到对象的位置。
我为“fullAbsolutePath”添加了一个值为[file].getAbsolutePath()
的附加条目,其中[file]
是附近的java.io.file实例。我在所有可以找到的地方做到这一点只是为了安全,因为它似乎没有伤害任何东西。
然后我修改了plugins \ file文件夹中的FileEntry.js和File.js,以便将该值填充到文件条目对象。
仍然试图解决问题,但我相信我走在正确的轨道上......
我认为更好的解决方案是修改inAppBrowser插件以识别和解析cordovaFile://协议并确保它们故意模糊绝对文件系统路径 - 但这可能有点超出我的范围。
编辑 - 是的!这个有效!我现在可以获取文件条目,调用文件方法,然后从fileObject读取fullSystemPath。值就像我的android上的“/ storage / emulated / 0 / whatever /”。只需要预先添加“file://”,window.open就会接受它。答案 2 :(得分:2)
如果要升级到新的(1.0.0或更新版本)File,和 您以前一直使用entry.fullPath作为参数 下载()或upload(),然后您将需要更改您要使用的代码 而是文件系统URL。
FileEntry.toURL()和DirectoryEntry.toURL()返回文件系统URL 形式
cdvfile:// localhost / persistent / path / to / file,可以在适当的位置使用 download()和upload()方法中的绝对文件路径。
您可以尝试删除cdvfile://localhost/persistent
以获得可与您的window.open配合使用的网址。 (可能从使用entry.toURL()
)
答案 3 :(得分:1)
在当前的插件开发分支中有一个解决方案:
Entry.toNativeURL() - 返回设备FileSystem中文件的完整路径。
答案 4 :(得分:1)
我知道这已经回答了,但我在entry.toInternalURL()
获得了最大的成功。
答案 5 :(得分:0)
“cdvfile:// localhost / persistent”后面的路径就像一个根应用程序(www文件夹)路径。换句话说,我的意思是您可以使用“cdvfile:// localhost / persistent”后面的路径访问图像或下载的文件。
实施例
下载目标路径:“cdvfile://localhost/persistent/MyImages/thebestimageever.jpg”
在HTML图片代码中,我可以执行此操作:<img src="/MyImages/thebestimageever.jpg" />
效果很好。
答案 6 :(得分:0)
只需在下载方法中编写window.open,或者在打开之前再次询问文件系统和条目,如果你想单独制作
function downloadFile(fileURL, destination, fileName) {
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
fileSystem.root.getDirectory(destination, {
create: true
}, function (dirEntry) {
var ft = new FileTransfer();
ft.download(fileURL, dirEntry.toURL() + "/fileName", function (entry) {
alert(fileName + " downloaded successfully at:" + dirEntry.fullPath);
window.open(dirEntry.toURL() + "fileName", "_blank", "location=yes");
}, function (error) {
alert("download failed: " + JSON.stringify(error));
});
}, function (error) {
alert("dir creation failed: " + JSON.stringify(error));
});
}, function (error) {
alert("requesting file system failed: " + JSON.stringify(error));
});
}
如果你的目的地是多个文件夹级别,那么你必须逐个递归地询问getDirectory(如果你的文件夹已经创建,那么一次调用该方法就足够了)
PS: - 在iOS文件上下载到&#39; Documents&#39;文件夹而不是&#39; www&#39;所以app.js内容的位置与某些人说的不同 - 如果您从下载的解压缩文件夹中打开带有js和css的html页面,则必须对InAppBrowser.m进行一些更改才能使其正确加载