ejemplo - filereader javascript
Use Blob en el complemento de Firefox (1)
He intentado que el siguiente código funcione en el complemento de Firefox:
var oMyForm = new FormData();
oMyForm.append("username", "Groucho");
oMyForm.append("accountnum", 123456); // number 123456 is immediately converted to string "123456"
// HTML file input user''s choice...
oMyForm.append("userfile", fileInputElement.files[0]);
// JavaScript file-like object...
var oFileBody = ''<a id="a"><b id="b">hey!</b></a>''; // the body of the new file...
var oBlob = new Blob([oFileBody], { type: "text/xml"});
oMyForm.append("webmasterfile", oBlob);
var oReq = new XMLHttpRequest();
oReq.open("POST", "http://foo.com/submitform.php");
oReq.send(oMyForm);
Entonces sé que tengo que usar XPCOM, pero no puedo encontrar el equivalente. Encontré esto hasta ahora:
var oMyForm = Cc["@mozilla.org/files/formdata;1"].createInstance(Ci.nsIDOMFormData);
oMyForm.append("username", "Groucho");
oMyForm.append("accountnum", 123456); // number 123456 is immediately converted to string "123456"
// JavaScript file-like object...
var oFileBody = ''<a id="a"><b id="b">hey!</b></a>''; // the body of the new file...
var oBlob = Cc["@mozilla.org/files/file;1"].createInstance(Ci.nsIDOMFile, [oFileBody], { type: "text/xml"});
oMyForm.append("webmasterfile", oBlob);
var oReq = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
oReq.open("POST", "http://localhost:3000");
oReq.send(oMyForm);
Básicamente, el problema es var oBlob = Cc["@mozilla.org/files/file;1"].createInstance(Ci.nsIDOMFile, [oFileBody], { type: "text/xml"});
porque "@mozilla.org/files/file;1"
o Ci.nsIDOMFile
es incorrecto. Tenga en cuenta que nsIDOMFile hereda de nsIDOMBlob.
¿Alguien sabe qué hacer?
Gracias un montón.
Vamos a engañar un poco para responder esto:
- Los módulos de código JS realmente tienen
Blob
yFile
, mientras que los módulos SDK no :( -
Cu.import()
devolverá el global completo de un módulo de código, incl.Blob
. - Sabiendo eso, podemos obtener un
Blob
válido importando un módulo conocido, comoServices.jsm
Ejemplo completo y probado, basado en su código:
const {Cc, Ci, Cu} = require("chrome");
// This is the cheat ;)
const {Blob, File} = Cu.import("resource://gre/modules/Services.jsm", {});
var oMyForm = Cc["@mozilla.org/files/formdata;1"].createInstance(Ci.nsIDOMFormData);
oMyForm.append("username", "Groucho");
oMyForm.append("accountnum", 123456); // number 123456 is immediately converted to string "123456"
// JavaScript file-like object...
var oFileBody = ''<a id="a"><b id="b">hey!</b></a>''; // the body of the new file...
var oBlob = Blob([oFileBody], { type: "text/xml"});
oMyForm.append("webmasterfile", oBlob, "myfile.html");
var oReq = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
oReq.open("POST", "http://example.org/");
oReq.send(oMyForm);