1

我想从 Firefox 插件将图像上传到站点。

我知道我可以createElement('canvas'),将图像数据转换为 base64 和 XHR POST 数据,但我想看看是否可以让 Firefox 处理它。

通常,用户会在网站上点击浏览,Firefox 会打开File Upload对话框,选择文件,然后点击打开。

我想从上下文菜单中自动执行该操作,以便可以将浏览器打开的本地文件(即图像)直接上传到目的地。

这可能吗?怎么做?

澄清:

在通过 Firefox 上传的文件选择中,这些是必需的数据:
- 目标表单
- 本地文件位置
- 附加到文件上传对话框中打开按钮的操作

在我想创建的上下文菜单情况下:
-目标表单:将在脚本中进行硬编码
-本地文件位置:右键单击的文件(即gContextMenu.target.src
-操作:这是我想要的执行并将“命令”附加到上述按钮的功能(现有的 Firefox 功能)

这意味着,不是手动创建new XMLHttpRequest()和发布数据,而是使用 Firefox 的现有功能。

换句话说,手动将“目标表单”和“本地文件位置”提供给 FILE UPLOAD 的 OPEN 按钮功能,就好像这是执行的过程一样。

文件上传对话框

4

1 回答 1

3

使用 DOM 文件

DOMFile构造函数实际上接受普通路径(来自特权代码)

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. 因此,只需知道文件的路径,然后用适当的 Content-Type初始化 a nsIFileInputStream,它的“超级接口”nsIInputStream和ing 东西。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)来构造更复杂的有效载荷。

于 2014-07-14T21:40:56.010 回答