web-dev-qa-db-ja.com

Cordova / PhoneGap Open Downloaded File(InAppBrowser)

Cordova/PhoneGap 3.3.0を使用して、FileTransferプラグインを使用してファイルをダウンロードし、InAppBrowserプラグインを使用してそれを開こうとしています。 ファイルを正常にダウンロードして、一時ディレクトリに配置できます。 FileプラグインがURLスキーマを使用するようになったので、InAppBrowserプラグインの_window.open_メソッドに正しいURL /パスを渡す方法がわかりません。関連するドキュメントも見つかりません。私が見つけることができる「ダウンロードして開く」ドキュメントはすべて古く、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
);
_

現在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"
_
11
chadiusvt

私はこれに対する解決策があると思いますが、それはちょっと厄介です。

Cordova Javaを調べて、ファイルエントリJSONオブジェクトを作成した場所を探しました。具体的には、オブジェクトにfullPathを追加する場所を探しました。

「fullAbsolutePath」の値を[file].getAbsolutePath()に追加しました。ここで、[file]は、近くにあるJava.io.fileインスタンスです。安全を確保するために見つけたすべての場所でこれを行いました。

次に、plugins\fileフォルダーのFileEntry.jsとFile.jsを変更して、その値もファイルエントリオブジェクトに入力します。

まだ問題を解決しようとしていますが、私は正しい方向に進んでいると思います...

より良い解決策は、cordovaFile://プロトコルを認識して解決するようにinAppBrowserプラグインを変更し、それらが意図的に絶対ファイルシステムパスを覆い隠すことです。

編集-うん!これは機能します!これで、ファイルエントリを取得し、fileメソッドを呼び出して、fileObjectからfullSystemPathを読み取ることができます。 Androidでの値は「/ storage/emulated/0/whatever /」のようになります。 "file://"を前に付けるだけで、window.openがそれを受け入れます。

5
nihlton

Cordova 3.4以降、ファイルプロトコルが変更され、fullPathを使用する代わりに、cdvfile://path/to/your/file.extパスを返すtoURL()が提供されるようになりました。

したがって、ファイルシステムオブジェクトのコールバック(entry引数を使用)を使用してファイルをダウンロードするときは、entry.toURL()を呼び出し、次のステートメントを使用してファイルを開きます。

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

私はそれについて私のブログの this post に書きました(すべての参照と背景情報が必要な場合)。

6
EeKay

最新のコルドバのドキュメント

Fileの新しいバージョン(1.0.0以降)にアップグレードする場合で、以前にdownload()またはupload()の引数としてentry.fullPathを使用していた場合は、ファイルシステムのURLを使用するようにコードを変更する必要があります。代わりに。

FileEntry.toURL()およびDirectoryEntry.toURL()は、次の形式のファイルシステムURLを返します

cdvfile:// localhost/persistent/path/to/file。これは、download()メソッドとupload()メソッドの両方で絶対ファイルパスの代わりに使用できます。

あなたが試すことができるのは、あなたのwindow.openで動作するURLを持つために_cdvfile://localhost/persistent_を削除することです。 (おそらく、entry.toURL()で取得した内容のアラートまたはconsole.logから始めます)

2
QuickFix

これは既に回答済みですが、entry.toInternalURL()で最も成功しました。

1
keldar

現在のプラグインの開発ブランチには解決策があります:

Entry.toNativeURL()-デバイスFileSystem内のファイルへのフルパスを返します。

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

1
xudre

個別に作成する場合は、ダウンロードメソッド内で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を1つずつ再帰的に要求する必要があります(フォルダがすでに作成されている場合は、メソッドを1回呼び出すだけで十分です)

PS:-iOSでは、ファイルは「ドキュメント」フォルダーにダウンロードされ、「www」にはダウンロードされないため、app.jsコンテンツの場所は他の人の言うとおりではありません。次に、InAppBrowser.mにいくつかの変更を加えて、適切にロードする必要があります。

0
Chepaki

「cdvfile:// localhost/persistent」に続くパスは、ルートアプリ(wwwフォルダー)パスのようなものです。つまり、「cdvfile:// localhost/persistent」に続くパスを使用して、イメージまたはダウンロードしたファイルにアクセスできることを意味します。

ターゲットパスをダウンロード: "cdvfile://localhost/persistent/MyImages/thebestimageever.jpg"

HTML画像タグでこれを行うことができます:<img src="/MyImages/thebestimageever.jpg" />

そして、それはうまくいきます。

0
Rahnzo