5

Estoy escribiendo una extensión de Google Chrome que le permite descargar un archivo de copia de seguridad de sus datos. Quiero que el usuario pueda presionar un botón y que se abra un cuadro de diálogo "Guardar como" y que puedan guardar el archivo en su computadora. Nada parece funcionar y no he encontrado una respuesta en Internet. He intentado varios enfoques:Descargue la fuerza en Google Chrome Extensión

  1. Usando document.execCommand('SaveAs', null, 'filename.json'); Esto no funciona porque este comando es IE-solamente y no parece ser una alternativa Webkit
  2. Usando URIs de datos. Este fue el más prometedor y funcionó en Opera y Firefox, pero el problema es que ni Chrome ni Safari parecen ser compatibles con Content-disposition = attachment; -header en el URI. Este debe funcionar. (Chrome ni siquiera me permite ctrl/cmd+s una página desde un URI de datos)
  3. Usando un XMLHTTPRequest. No he intentado esto, pero tiene que haber alguna forma de retransmitir la solicitud. Tenga en cuenta que no quiero usar un servidor externo (en ese caso, podría simplemente haber enviado una solicitud POST y aplicar una disposición de contenido: -header)
  4. Uso de una API de extensión de Chrome disponible. Pero no parece haber nada para este propósito.

La razón por la que no quiero utilizar ningún servidor externo es porque no quiero tener que pagar por el alojamiento, y los datos enviados pueden ser sensibles para el usuario, y no quiero infringir la privacidad de cualquier persona.

¿Alguien ha conseguido esto para trabajar?

+2

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

Respuesta

3

Lo hice de la siguiente manera en el código de Appmator en Github.

El enfoque básico es construir tu Blob, como quieras (Chrome/WebKit/Firefox tiene una respuestaBlob en XmlHttpRequest para que puedas usar eso), crear un iframe (oculto, mostrar: ninguno) luego asignar el src del iframe para ser el Blob.

Esto iniciará una descarga y la guardará en el sistema de archivos. El único problema es que aún no puedes configurar el nombre de archivo.

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

Probablemente soy ciego, pero ¿dónde exactamente es la creación de blob exactamente en tu código? ¿Dónde "pongo la URL" (o xmlhttprequest)? –

+0

Este código actualmente no está actualizado, pero fue a través de BlobBuilder y bb.append() – Kinlan

+0

... ¿cómo hacerlo con el código "no desactualizado"? (Encontré esta respuesta a través de google ...) –

Cuestiones relacionadas