2014-02-21 58 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()