Cordova/PhoneGap 3.3.0を使用して、FileTransferプラグインを使用してファイルをダウンロードし、InAppBrowserプラグインを使用してそれを開こうとしています。 ファイルを正常にダウンロードして、一時ディレクトリに配置できます。 FileプラグインがURLスキーマを使用するようになったので、InAppBrowserプラグインの_window.open
_メソッドに正しいURL /パスを渡す方法がわかりません。関連するドキュメントも見つかりません。私が見つけることができる「ダウンロードして開く」ドキュメントはすべて古く、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
);
_
現在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"
_
私はこれに対する解決策があると思いますが、それはちょっと厄介です。
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がそれを受け入れます。
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 に書きました(すべての参照と背景情報が必要な場合)。
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から始めます)
これは既に回答済みですが、entry.toInternalURL()
で最も成功しました。
現在のプラグインの開発ブランチには解決策があります:
Entry.toNativeURL()-デバイスFileSystem内のファイルへのフルパスを返します。
個別に作成する場合は、ダウンロードメソッド内で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にいくつかの変更を加えて、適切にロードする必要があります。
「cdvfile:// localhost/persistent」に続くパスは、ルートアプリ(wwwフォルダー)パスのようなものです。つまり、「cdvfile:// localhost/persistent」に続くパスを使用して、イメージまたはダウンロードしたファイルにアクセスできることを意味します。
例
ターゲットパスをダウンロード: "cdvfile://localhost/persistent/MyImages/thebestimageever.jpg"
HTML画像タグでこれを行うことができます:<img src="/MyImages/thebestimageever.jpg" />
そして、それはうまくいきます。