5

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

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

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

Неужели кто-нибудь получил это на работу?

+2

см http://stackoverflow.com/questions/4003352/chrome-extension-download-export-content-created-on-the-fly – serg

ответ

3

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

Основной подход заключается в том, чтобы создать свой Blob, однако вы хотите (Chrome/WebKit/Firefox имеет responseBlob на XmlHttpRequest, чтобы вы могли его использовать), создать iframe (hidden, display: none), затем назначить src iframe, чтобы быть Blob.

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

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); 
+0

Я наверное слепой, но где именно создание блоб точно в вашем коде? Где я могу указать URL-адрес (или xmlhttprequest)? –

+0

Этот код действительно устарел, но он был через BlobBuilder и bb.append() – Kinlan

+0

... как это сделать с кодом «не устаревший»? (Я нашел этот ответ через google ...) –