Принудительная загрузка в Google Chrome Extension - PullRequest
5 голосов
/ 23 ноября 2010

Я пишу расширение Google Chrome, которое позволяет вам загрузить файл резервной копии ваших данных.Я хочу, чтобы пользователь мог нажать кнопку, и должно открыться диалоговое окно «Сохранить как», и он может сохранить файл на своем компьютере.Ничто не работает, и я не нашел ответа в Интернете.Я пробовал несколько подходов:

  1. Использование document.execCommand('SaveAs', null, 'filename.json'); Это не работает, потому что эта команда только для IE, и, похоже, нет альтернативы Webkit
  2. Использование URI данных .Это было наиболее многообещающим и работало в Opera и Firefox, но проблема в том, что ни Chrome, ни Safari не поддерживают заголовок Content-disposition = attachment; -header в URI.Это должно работать.(Chrome даже не позволяет мне ctrl/cmd+s страницы из URI данных)
  3. Использование XMLHTTPRequest.Я не пробовал это, но должен быть какой-то способ, которым вы могли бы передать запрос?Обратите внимание, что я не хочу использовать внешний сервер (в этом случае я мог бы просто отправить POST-запрос и применить Content-disposition: -header)
  4. Используя доступный API-интерфейс расширения Chrome.Но, похоже, ничего для этого не существует.

Причина, по которой я не хочу использовать какой-либо внешний сервер, заключается в том, что я не хочу платить за хостинг, иОтправленные данные могут быть конфиденциальны для пользователя, и я не хочу, чтобы кто-то нарушал их конфиденциальность.

Кто-нибудь заставил это работать?

1 Ответ

3 голосов
/ 18 мая 2011

Я сделал это следующим образом в коде Appmator на Github.

Основной подход состоит в том, чтобы создать свой BLOB-объект, как вы хотите (Chrome / WebKit / Firefox имеет responseBlob для XmlHttpRequest, так что вы можете использовать это), создайте iframe (скрытый, display: none), затем назначьте src для iframe быть шариком.

Это запустит загрузку и сохранит ее в файловой системе. Единственная проблема в том, что вы пока не можете установить имя файла.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...