私は、外部ファイルのコレクションにアクセスする必要があるアプリケーションで作業しています。それは基本的に音楽プレーヤーです。それはWebサーバーの下で期待どおりに動作しますが、私はまた、ブラウザでローカルに作業したいと思います。JavaScriptで外部ファイルのコレクションをローカルで読む
一般概要:
- のindex.htm(マークアップと小インデックスファイル、外部jsファイルを収集し、CSS)
- index.js(ここではすべてのアプリのコード)
- dir.js(すべての音楽ファイルのファイルパスのアレイ)
- /AHX /(音楽ファイルの場所)
- ahx.js(音楽プレーヤコード)
二つの主な困難は以下のとおりです。
- JavaScriptは、それが子供のディレクトリである場合でも、ディレクトリの内容を一覧表示することはできません。代わりに、ファイルパスを文字列の配列として表現します。
- XMLHttpRequestを使用してのみ外部ファイルを読み込むことができます。これはローカル/オフラインを実行しているときにセキュリティの制限がありますが、他の環境(HTTPやChromeアプリケーション、おそらく他のプラットフォームの下ではわかりません)で動作します。
奇妙なことに、最新のFirefoxでは、2)はもう問題ではありません。 XMLHttpRequest
は、security.fileuri.strict_origin_policy
を無効にすることなくローカルで動作します。私はそれが標準的な動作であるかどうかはわかりませんが、Chromeはそれを許可するようには見えません。
私の現在の解決策は、.jsファイル(以前はXHRを必要とするtxtファイルを使用)でファイルパスのリストを生成し、XMLHttpRequest
を使用して音楽ファイルをロードしています。もちろんこれは、シェルスクリプトを使用してdir.jsファイルを再構築することで、フォルダ構造とファイルパスデータベースを同期させておく必要があることを意味します。
XHRはHTTP経由でしか動作しないため、Webサーバーが必要です。私はそのアプリケーションをローカルで(そしてユーザーに強制的にChromeアプリケーションとしてインストールさせるだけではなく)働かせたいと思っています。だから私はこの質問をして、データを読むための別の方法を見つけるよう求めています。
私が試した1つの選択肢は、1000個のファイルをすべてbase64文字列でエンコードし、それをJSオブジェクトに格納することでした。これにより、かなり大きな8MBの.jsファイルが生成されます。それは読み込みが遅くないようですが、私はそれが正確に効率的ではないと推測しています...それは更新/維持する苦痛です。
localStorage、IndexedDB、Web SQLはすべてオプションですが、アプリケーションを実行する前にストレージを事前に設定する方法はありません。おそらくFile APIを利用して、ストレージデータベースの1回限りの設定を行うことができます。
私の質問に戻る:大量のバイナリファイル(200以上のファイル、6MB以上など)にアクセスするための解決策は何ですか?(つまり、.htmlファイルを直接開きます)?
編集:The app in question on GitHub、私の使用例の混乱を解消する。しかし、一般的に、私はクロス・オリジン・エラーを起こすことなく、これらの音楽ファイルをローカルからアプリから自動的に読み込む方法を探しています。また、hereは 'js-database'バージョンです。これは、8MBのjsファイルに1000個のファイルをすべて保存します。
[{data:"base64-string-of-data-here",path:"original-path-here"}, ...]
このようにして、XHRの必要性が回避されます。
Edit2:jszipとIndexedDBを使用したソリューションが有望です。選択した複数のフォルダから複数のファイルをロードすることはできませんが、ディレクトリツリーが圧縮されている場合、jszipは/FOLDER_HERE/FILE_HERE
という形式のすべてのファイルの配列にアクセスできます。パスとバイナリデータは、一度のセットアップでIndexedDBにインポートできます。また、重要なURLのfile://
では正常に動作します。
jszipを使用して、コンテンツのBASE64文字列の大きなJSON構造を効果的に構築/更新することもできますが、これはユーザーが設定する必要はありません。しかし、まだテストする必要があります。
ローカルで使用する場合はファイルの代わりにlocalStorageを使用してください。 – juvian
ローカルで実行されると、アプリケーションは実行可能ファイル内にラップされますか(ローカルサーバーが含まれます)、ブラウザで直接HTML/jsファイルとして実行されますか? 2番目のケースであれば、ソースファイルのユーザー変更に対してコードに特別なセキュリティを実装する必要があるかもしれません。 – Kaddath
@Kaddathこれはhtml/jsに直接なります。アプリ自体はChromeアプリと通常のウェブページアプリの両方で動作します。ユーザーがソースを変更するとどうして気になるのですか?これは基本的にオープンソースであり、完全にオフラインで動作します。私は実行可能なJSアプリケーションがどのように実行されているのかよく分かりませんが(電子/ノード?)、意味があれば可能な限りクロスターゲットとしてコードを保持したいと思います。 基本的には、FirefoxでHTMLを開くときに自分のアプリケーションが動作する場合、その基本的なブラウザ機能を維持し、他のターゲットでしか動作しない機能を検出する必要があります。 – bryc