2011-01-23 12 views
6

Quiero generar un archivo CSV como resultado de algunas interacciones del usuario y luego solicitar al usuario que lo descargue. ¿Cómo puedo hacer eso?¿Cómo generar un archivo para descargar en una extensión de Google Chrome?

No creo que sea posible en JS directo, pero tal vez Chrome me da algunos privilegios elevados?

+0

He hecho esto en ASP.NET. ¿Qué tecnologías estás usando? –

+0

@Jon: las extensiones de Chrome están escritas en JS ... no creo que tenga otras opciones. – mpen

Respuesta

2

Chrome no proporciona ninguna ayuda con esto, pero creo que debería poder desencadenar un cuadro de diálogo para guardar archivos utilizando la biblioteca downloadify js que utiliza un componente flash detrás de las escenas.

+0

Parece que bloquea Firefox para mí cuando pruebo la demo. Chrome no se cuelga ... así que creo que puedo vivir con eso. – mpen

5

Ahora puede usar HTML5 File API para descargar un archivo. Todavía está en desarrollo, pero se puede utilizar un BlobBuilder y redirigir su uso para descargar el archivo:

var bb = new BlobBuilder(); 
bb.append(csvContents); 
var blob = bb.getBlob(); 
location.href = window.webkitURL.createObjectURL(blob); 

Para más información sobre la API de archivos, HTML5Rocks tiene un gran tutorial:

http://www.html5rocks.com/tutorials/file/filesystem/

+0

¿Chrome 10 es compatible con esto? – mpen

+0

Sí, en Chrome 10 lo cambiaron por "window.webkitURL.createObjectURL". Edité mi respuesta para reflejar eso. El único problema con este enfoque (se resolverá pronto) es que no puedes controlar el nombre del archivo. Pruébelo en su inspector. –

+0

"No se permite cargar el recurso local: blob: null/6b2c341a-ad40-48b2-9755-1b7134832d39". Puedo copiar eso en la barra de direcciones y descargar el archivo, pero ¿por qué Chrome no lo permite? – mpen

1

Necesitaba hacer exactamente el mismo archivo de generación reciente e imponer su descarga en la extensión de Chrome. Aquí tiene un código de hacer eso fragmento, utilizando ES6 y los métodos recomendados:

let docContent = ... /* your content */; 
let doc = URL.createObjectURL(new Blob([docContent], {type: 'application/octet-binary'})); 
chrome.downloads.download({ url: doc, filename: filename, conflictAction: 'overwrite', saveAs: true }); 

También tiene que declarar un privilegio adecuado en manifest.json:

"permissions" : ["downloads"] 
Cuestiones relacionadas