5

データのバックアップ ファイルをダウンロードできる Google Chrome 拡張機能を作成しています。ユーザーがボタンを押すと、[名前を付けて保存] ダイアログ ボックスが開き、ファイルを自分のコンピューターに保存できるようにしたいと考えています。何も機能していないようで、インターネットで答えが見つかりません。私はいくつかのアプローチを試しました:

  1. document.execCommand('SaveAs', null, 'filename.json');このコマンドは IE 専用であり、Webkit の代替手段がないように見えるため、Thisを使用しても機能しません。
  2. データ URIの使用。これは最も有望で、Opera と Firefox で機能しましたが、問題は、Chrome も Safari も URI の Content-disposition=attachment;-header をサポートしていないように見えることです。これはうまくいくはずです。ctrl/cmd+s(Chrome では、データ URI からページにアクセスすることさえできません)
  3. を使用しXMLHTTPRequestます。私はこれを試したことはありませんが、リクエストを中継できる方法が必要ですか? 外部サーバーを使用したくないことに注意してください (その場合、単純に POST 要求を送信して Content-disposition:-header を適用することもできます)。
  4. 利用可能な Chrome 拡張 API を使用する。しかし、この目的のためのものはないようです。

外部サーバーを使用したくない理由は、ホスティングに料金を支払う必要がなく、送信されるデータがユーザーにとって機密である可能性があり、誰のプライバシーも侵害したくないからです。

誰かがこれを機能させましたか?

4

1 に答える 1

3

Github の Appmator コードで次のようにしました。

基本的なアプローチは、必要に応じて Blob を作成し (Chrome/WebKit/Firefox には XmlHttpRequest に responseBlob があるため、それを使用できます)、iframe (hidden、display:none) を作成し、iframe の src をブロブ。

これにより、ダウンロードが開始され、ファイルシステムに保存されます。唯一の問題は、まだファイル名を設定できないことです。

var savaeas = document.getElementById("saveas");
var bb = new (window.BlobBuilder || window.WebKitBlobBuilder)();

var output = Builder.output({"binary":true});
var ui8a = new Uint8Array(output.length);

for(var i = 0; i< output.length; i++) {
  ui8a[i] = output.charCodeAt(i);
}

bb.append(ui8a.buffer);

var blob = bb.getBlob("application/octet-stream");
var saveas = document.createElement("iframe");
saveas.style.display = "none";

if(!!window.createObjectURL == false) {
  saveas.src = window.webkitURL.createObjectURL(blob); 
}
else {
  saveas.src = window.createObjectURL(blob); 
}

document.body.appendChild(saveas);
于 2011-05-18T13:07:38.063 に答える