Cordova / PhoneGap打开下载的文件(InAppBrowser)

时间:2014-02-21 17:56:02

标签: cordova inappbrowser

使用Cordova / PhoneGap 3.3.0,我使用FileTransfer插件下载文件,然后尝试使用InAppBrowser插件打开它。 我可以成功下载文件,并将其放在临时目录中。由于File插件现在使用URL模式,我无法弄清楚如何将正确的url /路径传递给InAppBrowser插件的window.open方法。我也找不到任何相关文件。我能找到的所有“下载和打开”文档都已过时并且是URL前架构。

相关链接:

我发现过时的例子:

这是我的代码:

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"

7 个答案:

答案 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)

他们在the latest cordova docs

  

如果要升级到新的(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()

获得的警报或console.log开始

答案 3 :(得分:1)

在当前的插件开发分支中有一个解决方案:

Entry.toNativeURL() - 返回设备FileSystem中文件的完整路径。

https://github.com/apache/cordova-plugin-file/tree/dev

答案 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进行一些更改才能使其正确加载