我想将图片从Firefox Addon上传到网站。
我知道我可以createElement('canvas')
,将图像数据转换为base64和XHR POST数据,但我想看看是否可以让Firefox处理它。
通常,用户将在网站上单击“浏览”,然后Firefox将打开File Upload
对话框,选择文件,然后单击“打开”。
我想从上下文菜单中自动执行此操作,以便浏览器打开的本地文件(即图像)可以直接上传到目的地。
这可能吗?如何?
澄清:
在通过Firefox上传的文件选择中,这些是必需的数据:
- 目标表格
- 本地文件位置
- 附加到“文件上传”对话框中的“打开”按钮的操作
在我想要创建的上下文菜单中:
- 目标形式:将在脚本中硬编码
- 本地文件位置:右键单击的文件(即gContextMenu.target.src
)
- 动作:这就是我想做的事情并将'命令'附加到上面按钮的功能(现有的Firefox功能)
这意味着,不是手动创建new XMLHttpRequest()
和POST数据,而是使用Firefox的现有功能。
换句话说,手动输入'目标形式'& “本地文件位置”到FILE UPLOAD的OPEN按钮功能,就好像那是执行过程一样。
答案 0 :(得分:3)
DOM File
constructor actually accepts plain paths (from privileged code)
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://example.org/");
xhr.setRequestHeader("Content-Type",
"application/octet-stream");
xhr.send(new File("/tmp/test.upload"));
这可以与表单数据结合使用。
您可以发送nsIInputStream
。因此,只需知道文件的路径,然后初始化nsIFileInputStream
,超级接口"使用适当的内容类型将nsIInputStream
和send()
内容删除。
var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/FileUtils.jsm");
var stream = Cc["@mozilla.org/network/file-input-stream;1"].
createInstance(Ci.nsIFileInputStream);
stream.init(FileUtils.File("/tmp/test.upload"),
-1, -1,
Ci.nsIFileInputStream.DEFER_OPEN);
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://example.org/");
xhr.setRequestHeader("Content-Type",
"application/octet-stream");
xhr.send(stream);
这可以与nsIMultiplexInputStream合并(IIRC)以构建更复杂的有效载荷。