javascript - Firefox 插件 : Uploading Image

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

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

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

通常情况下,用户会在站点上单击“浏览”,然后 Firefox 会打开“文件上传”对话框,选择文件,然后单击“打开”。

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

这可能吗?如何实现?

澄清:

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

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

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

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

File Upload Dialogue Box

最佳答案

使用 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 即可。 , nsIInputStream 的“ super 接口(interface)”和 send()使用适当的 Content-Type 关闭内容。

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

关于javascript - Firefox 插件 : Uploading Image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24743145/

相关文章:

javascript - 使用 jQuery 和 javascript 附加元素时出现奇怪的格式

javascript - 内容未被从被覆盖的元素内部删除

javascript - 从数据对象数组创建折线图

javascript - 对本地文件系统的 AJAX 请求在 Chrome 中不起作用?

c# - 如何使用 ajax 调用将 formcollection 传递给一个 Action ?

javascript - Firefox 插件内的网站

javascript - 如何修复 Heroku 中的 window.open() 问题?

python - 尝试上传文件时“无法更改上传处理程序”

javascript - 如何打开文件:///URL Firefox extension developement?的选项卡

javascript - Firefox 扩展 js 错误日志,在哪里?