Javascript 在firefox加载项上使用Blob

Javascript 在firefox加载项上使用Blob,javascript,firefox,firefox-addon,firefox-addon-sdk,xpcom,Javascript,Firefox,Firefox Addon,Firefox Addon Sdk,Xpcom,一直在尝试让以下代码在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("us

一直在尝试让以下代码在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);
var myform=new FormData();
myform.append(“用户名”、“Groucho”);
myform.append(“accountnum”,123456);//数字123456立即转换为字符串“123456”
//HTML文件输入用户的选择。。。
myform.append(“userfile”,fileInputElement.files[0]);
//JavaScript类文件对象。。。
黑体变异数

所以我知道我必须使用XPCOM,但我找不到等效的。到目前为止,我发现:

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);
var myform=Cc[“@mozilla.org/files/formdata;1”].createInstance(Ci.nsIDOMFormData);
myform.append(“用户名”、“Groucho”);
myform.append(“accountnum”,123456);//数字123456立即转换为字符串“123456”
//JavaScript类文件对象。。。
变量oFileBody='hey!';//新文件的正文。。。
var oBlob=Cc[“@mozilla.org/files/file;1”].createInstance(Ci.nsIDOMFile,[oFileBody],{type:“text/xml”});
附加(“webmasterfile”,oBlob);
var oReq=Cc[“@mozilla.org/xmlextas/xmlhttprequest;1”].createInstance(Ci.nsIXMLHttpRequest);
开放式(“POST”http://localhost:3000");
oReq.发送(myForm);
本质上,问题是
var oBlob=Cc[“@mozilla.org/files/file;1”].createInstance(Ci.nsIDOMFile,[oFileBody],{type:'text/xml})“@mozilla.org/files/file;1”
Ci.nsIDOMFile
不正确。请注意,nsIDOMFile是从nsIDOMBlob继承的

有人知道该怎么做吗


非常感谢。

让我们通过作弊来回答这个问题:

  • 实际上有
    Blob
    文件
    ,而SDK模块没有:(
  • Cu.import()
    将返回代码模块的完整全局值,包括
    Blob
  • 知道了这一点,我们就可以通过导入一个已知的模块,比如
    Services.jsm
基于您的代码的完整、经过测试的示例:

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);
const{Cc,Ci,Cu}=require(“chrome”);
//这就是骗局;)
const{Blob,File}=Cu.import(“resource://gre/modules/Services.jsm", {});
var myform=Cc[“@mozilla.org/files/formdata;1”].createInstance(Ci.nsIDOMFormData);
myform.append(“用户名”、“Groucho”);
myform.append(“accountnum”,123456);//数字123456立即转换为字符串“123456”
//JavaScript类文件对象。。。
变量oFileBody='hey!';//新文件的正文。。。
var oBlob=Blob([oFileBody],{type:“text/xml”});
append(“webmasterfile”,oBlob,“myfile.html”);
var oReq=Cc[“@mozilla.org/xmlextas/xmlhttprequest;1”].createInstance(Ci.nsIXMLHttpRequest);
开放式(“POST”http://example.org/");
oReq.发送(myForm);

Heh,在多年使用和滥用该平台之后,我现在知道了很多。我很久以前偶然发现的那个骗局。剩下的就是试错。。。哦,而且我也调查了很多!这太壮观了!!它看起来像是发生了一些变化,您不能再像这样得到
Blob
文件了: