web-dev-qa-db-ja.com

Chrome=拡張機能は多くのファイルをユーザー指定のディレクトリに保存できますか?

私はChrome内部ツールとして使用される拡張機能に取り組んでいます。その必要な動作は次のとおりです。

  1. ページアクションとして、特定のイントラネットページを表示するときにアドレスバーアイコンを有効にします。
  2. ユーザーがアイコンをクリックすると、ページ上の特定のメディアタイプ(たとえば、.jpg)のすべてのファイルを識別します。
  3. それらをすべてユーザーのローカルドライブ上のディレクトリにサイレントに保存します。

この質問は以前に尋ねられました 、しかしその後の答えは " se NPAPI "、および NPAPIは現在遺棄されています でした。

それで、これを達成するために現在利用可能な方法は何ですか?私が見たものは次のとおりです。

  • chrome.FileSystem API ---しかし、これはユーザーがアクセス可能な場所にファイルを保存しません。代わりに、保存されているファイルは、ドキュメント化されていないディレクトリで 難読化された名前の後ろに隠されています です。ユーザーは、アクセス可能なディレクトリに元の名前でファイルを保存する必要があります。
  • HTML5ダウンロード属性 、データ:URLを作成し、プログラムでそれをクリックします。これにより、ファイルごとに「名前を付けて保存...」ダイアログがポップアップします。これは、1ページに100個のアセットがある場合は受け入れられません。ユーザーは、アイコンを1回クリックするだけで、さらに操作することなくファイルをダウンロードする必要があります。
  • Chrome Download API ですが、これはベータおよび開発チャンネルでのみ利用可能です。ユーザーは、Chromeでこの拡張機能を使用する必要があります。
  • Native Messaging API を使用して、ファイルをディスクに保存するだけの小さな.exeを作成してから、.jpgをblobとして渡します。これは非常に面倒で、大きなblobをそのようなEXEに確実に渡す方法すらわからない。

私が試すことができる別のアプローチはありますか?

67
Crashworks

あなたはかなり多くの研究を行ってきました。実際、通常のWebページは、プラグインまたは拡張機能なしではユーザーのファイルシステムに書き込むことができません。また、 HTML5 Filesystem API は、あなたが観察したように、仮想ファイルシステムへのアクセスのみを提供します。

ただし、 chrome.fileSystem HTML5 FileSystem APIを使用したAPI。 HTML FileSystem APIとは異なり、ChromeのfileSystem(アプリ)APIは、ユーザーのファイルシステムに直接書き込みできます(例:~/Documentsまたは%USERPROFILE%\Documents)、ユーザーが指定します。

このAPIは、拡張機能ではなくChromeappsでのみ使用可能です。これは特に問題ではありません。アプリと拡張機能をインストールし、拡張機能(ページアクション)とアプリ(ファイルシステムアクセス)の間で通信するために メッセージの受け渡し を使用できるため、内部ツールを開発する( example )。


約 - chrome.downloads :拡張機能は内部にあるため、このAPIを使用するために、ユーザーにベータ/開発チャンネルへのアクセスを強制することができます。このAPIの唯一の制限は、ファイルがユーザー定義のダウンロードフォルダー(のサブディレクトリ)に保存されることです。

編集:chrome.downloads AP​​Iは、安定ブランチを含むすべてのチャネルで利用できるようになりました(Chrome 31)以降)。

50
Rob W

私はあなたが宿題をしたことを恐れています。つまり、考えられるすべての選択肢を検討したということです。

あなたが望むものを正確に達成するための最良の方法は、(あなたが述べたように)サポートするネイティブアプリを使用し、ネイティブメッセージングを介して通信することです。ところで、イントラネットでは帯域幅が問題になることはめったにないので、リソース(画像など)のURLを渡し、アプリをダウンロードして保存する方が簡単な場合があります。
(はい、単純に拡張機能を開発するよりも面倒ですが、彼らがしなければならないことをしなければなりませんよね?)

一方、開発の単純さよりもユーザーエクスペリエンスを少し犠牲にする場合は、HTML5グッズ(ファイルをローカルで作成およびダウンロードできる)とJSジッピングライブラリ(=JSZip)。したがって、ユーザーは単一のZipファイルをダウンロードするだけで済みます(1回だけプロンプトが表示されます)。ところで、ユーザーが希望する場合、ユーザーはプロンプトを表示せずに常にファイルをダウンロードすることを選択できます(ただし、既に知っています)。

6
gkalpak

ネイティブメッセージングアプリのアイデアを使用します。

ネイティブアプリは扱いにくく、ドキュメントが貧弱なので書くのが苦労します。また、両端でJSONフォーマットを正確に取得しないと、stdinとstdoutが引き継がれるため、コンソールには何も表示されません。

ただし、標準ツール(Windowsエクスプローラー、16進エディター、TeamViewerなど)を使用してファイルを表示、移動、削除したり、何が起こっているかを確認したりできるため、完了したらより幸せになります。 Chromeのサンドボックス化されたファイルシステムは動作しますが、今では行き止まりのようです(他のブラウザはそれを選択していません)。サードパーティ製のツールを開発する人はいないでしょう。もちろん、すべてが機能したらツールはおそらく必要ありませんが、それまでは、どのファイルがどのディレクトリにあるか、ファイルのバージョンが残っているかを追跡するためにコード(および非常に多くのコード)を書く必要があるため、デバッグは悪夢ですディスクスペース...

3
DaveWalley