Firefox Addon:上传图片

时间:2014-07-14 18:18:24

标签: javascript ajax firefox-addon firefox-addon-restartless

我想将图片从Firefox Addon上传到网站。

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

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

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

这可能吗?如何?

澄清:

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

在我想要创建的上下文菜单中: - 目标形式:将在脚本中硬编码 - 本地文件位置:右键单击的文件(即gContextMenu.target.src
- 动作:这就是我想做的事情并将'命令'附加到上面按钮的功能(现有的Firefox功能)

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

换句话说,手动输入'目标形式'& “本地文件位置”到FILE UPLOAD的OPEN按钮功能,就好像那是执行过程一样。

File Upload Dialogue Box

1 个答案:

答案 0 :(得分:3)

使用DOM文件

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,超级接口"使用适当的内容类型将nsIInputStreamsend()内容删除。

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)以构建更复杂的有效载荷。