2011-07-12 20 views
7

Soy nuevo en el desarrollo de complementos de Firefox, y va bien hasta ahora, pero estoy estancado en cómo, esencialmente, descargar un archivo de la Web, dado un URI, y guardarlo en el disco. La documentación MDN de Mozilla tiene información sobre cómo cargar archivos, pero la sección de descarga de archivos está vacía y pendiente de ser escrita. Lamentablemente, no he encontrado ninguna documentación que describa cómo hacerlo.Descargando archivos con un complemento de Firefox

¿Alguien sabe de la documentación relevante sobre cómo hacer esto?


El antiguo complemento Facebook Foto Album Downloader utiliza esta llamada de función en su superposición JavaScript:

saveURL(images[i].replace(/\/s/g, "/n"), null, null, false, true, null); 

Obviamente, el primer argumento es el URI para solicitar. La función saveURL no está definida en ninguna parte, así que supongo que es una función de API de extensión. Lo probé en mi nuevo complemento y funciona. Sin embargo, me gustaría saber qué significan los otros argumentos.

+0

¿Has visto esto? http://stackoverflow.com/questions/3749231/download-file-using-javascript-jquery Utilicé JQuery en mi complemento de Firefox. – ysrb

+0

Lamentablemente, esto no funcionará para mí, ya que no tengo acceso al servidor web en cuestión y, por lo tanto, no puedo modificar el tipo MIME con el que se envían los archivos. Debe haber un método API nativo para hacer esto para las extensiones. Simplemente no puedo encontrarlo. –

+0

@Delan: 'saveURL' definitivamente no es una función de API; podría definirse en un módulo de JavaScript importado o algo así. –

Respuesta

5

La forma habitual de hacerlo es con nsIWebBrowserPersist:

var persist = 
    Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]. 
    createInstance(Ci.nsIWebBrowserPersist); 
persist.saveURI(serverURI, null, null, null, "", targetFile); 

Ver https://developer.mozilla.org/en/Code_snippets/Downloading_Files para obtener más información.

+1

A partir de FF 19, saveURI ha recibido un séptimo parámetro, privacyContext. Uso [aquí] (https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIWebBrowserPersist#saveURI%28%29) – Bora

1

Aquí hay una opción de copiar/pegar fácil para cualquiera que busque una solución rápida sin más problemas. Póngalo en main.js y cambie el nombre de archivo, el directorio y la url.

function DownloadFile(sLocalFileName, sRemoteFileName) 
{ 
    var saveToDirectory = 'C:\\Users\\louis\\downloads\\'; 

    var chrome = require("chrome"); 

    var oIOService = chrome.Cc["@mozilla.org/network/io-service;1"].getService(chrome.Ci.nsIIOService) 

    var oLocalFile = chrome.Cc["@mozilla.org/file/local;1"].createInstance(chrome.Ci.nsILocalFile); 
    oLocalFile.initWithPath(saveToDirectory + sLocalFileName); 

    var oDownloadObserver = {onDownloadComplete: function(nsIDownloader, nsresult, oFile) {console.log('download complete...')}}; 

    var oDownloader = chrome.Cc["@mozilla.org/network/downloader;1"].createInstance(); 
    oDownloader.QueryInterface(chrome.Ci.nsIDownloader); 
    oDownloader.init(oDownloadObserver, oLocalFile); 

    var oHttpChannel = oIOService.newChannel(sRemoteFileName, "", null); 
    oHttpChannel.QueryInterface(chrome.Ci.nsIHttpChannel); 
    oHttpChannel.asyncOpen(oDownloader, oLocalFile);  

} 
DownloadFile("saveAsThis.mp3","http://domain.com/file.mp3"); 
Cuestiones relacionadas