2014-02-21 83 views
10

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

相关链接:

已过期前的amples我发现:

这里是我的代码:

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 
); 

我目前TE在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

如果您最近更新了插件,也许您必须处理新的URL方案'cdvfile://'? http://cordova.apache.org/news/2014/02/10/plugins-release.html – QuickFix

+0

感谢您的评论。我正在使用这些最新的插件,在您提供的链接中引用。我读了这个,但不记得我发布的URL。我将它添加到相关链接部分。当我调用'entry.toURL()'我得到'cdvfile://'前缀的链接 – chadiusvt

+0

愚蠢的问题:为什么不直接使用window.open而不是先下载它的原始URL? – QuickFix

回答

4

我想我有一个解决方案,但它有点讨厌。

我通过cordova JAVA grepped并寻找它构造了一个文件条目JSON对象的地方。具体可以通过查找其中加入fullPath的地方。

我为值为[file].getAbsolutePath()的“fullAbsolutePath”添加了一个附加条目,其中[file]是任何位于附近的java.io.file实例。我在所有可以找到的地方都做到了这一点,只是为了安全起见,因为它看起来没有任何伤害。

然后,我修改了plugins \ file文件夹中的FileEntry.js和File.js,以将该值填充到文件入口对象。

仍在试图制定出扭结,但我相信我是在正确的轨道上......

我认为一个更好的解决办法是修改inAppBrowser插件来认识和解决cordovaFile://协议,并确保他们故意遮盖绝对文件系统的路径 - 但这可能会超出我的一点。

编辑 - 是!这工作!我现在可以获取文件条目,调用文件方法,然后从fileObject中读取fullSystemPath。值就像我的android上的“/ storage/emulated/0/whatever /”。只需要预先加上“file://”,window.open就会接受它。

+2

感谢您的所有工作。我也查看了cordova.java,看看你可能把所有这些对'fullAbsolutePath'的引用放在哪里。您可能希望将其提交给cordova团队以获取fileentry或inappbrowser插件。不能相信他们没有在更新的版本中加入这个功能。但我同意,编辑inappbrowser以正确识别url可能更有意义。很高兴你有它的工作,虽然! – chadiusvt

+0

他没有后顾之忧。我实际上是在试图为自己解决同样的问题,并认为我会分享。 – nihlton

+0

@nihlton你如何获得一个文件保存到你的应用程序文件夹? – trainoasis

2

the latest cordova docs他们说

如果你是升级到File的新版本(1.0.0或更新版本),以及 您以前一直在使用entry.fullPath作为的参数下载()或上传(),则需要更改代码以使用 文件系统URL。

FileEntry.toURL()和DirectoryEntry.toURL()返回的形式的文件系统URL

cdvfile://本地主机/持久性/路径/到/文件可在绝对的地方 可以使用文件路径都在download()和upload()方法中。

你可以尝试的是删除cdvfile://localhost/persistent有一个URL,可以与你的window.open工作。 (也许从警报或控制台开始。(entry.toURL()

+0

感谢您的支持。我也发现了这个文档,但是失去了它的URL。我曾尝试使用'toURL()',它也不返回可用的URL。我刚才编辑我的帖子以显示返回值。删除“cdvfile:// localhost/temporary”给了我与'entry.fullPath'同样的结果,这也不起作用。 – chadiusvt

+0

也许试试'file:///sdcard/'+entry.fullPath; – QuickFix

+0

我也尝试过使用绝对路径,但在inappbrowser中失败。然而,在你以前的建议中使用插件,我已经成功了! – chadiusvt

0

“cdvfile:// localhost/persistent”后面的路径就像根应用(www文件夹)路径。换句话说,我的意思是您可以使用“cdvfile:// localhost/persistent”后面的路径访问图像或下载的文件。

下载的目标路径: “cdvfile://localhost/persistent/MyImages/thebestimageever.jpg”

在HTML图像标记我可以这样做:<img src="/MyImages/thebestimageever.jpg" />

而且它的工作原理好。

+0

此解决方案似乎不适用于mp3和mp4文件。只有图像。 –

5

由于科尔多瓦3.4文件协议已发生变化,而不是使用FULLPATH他们现在提供一个返回的cdvfile的toURL()://path/to/your/file.ext路径。

所以,当你使用文件系统对象的回调(使用entry参数)下载文件时,只需调用entry.toURL()并使用以下语句打开它即可打开它 - 假设您安装了InApBrowser并且_blank将会打开该InAppBrowser的窗口:

window.open(entry.toURL(), '_blank', 'location=no,closebuttoncaption=Close,enableViewportScale=yes'); 

this post我的博客上写了一篇关于它(如果你希望所有的引用和背景资料)。

0

只写窗口。下载方法中打开或打开前,再次要求文件系统和入口,如果你想让它单独

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文件下载到'文件'文件夹,而不是'www',所以不是相同的位置app.js内容,如有些人所说 - 如果您打开一个HTML页面,使用js和css nloaded解压缩的文件夹,那么你必须在InAppBrowser.m上进行一些更改,使其加载正确

1

我知道这已经回答了,但我最成功的entry.toInternalURL()