使用新的 SDK Firefox Addon 通过 Post 发送文件

Send file via Post using new SDK Firefox Addon

我正在搜索使用新的 Firefox SDK for addons 中的 "Request" class 将 zip 文件发送到服务器。这是我的代码:

var Request = require("sdk/request").Request;
var file = new FileUtils.File(pathToZipFile);
Request({
   url: serverURL,
   content: file,
   onComplete: function (response) {
       for (var headerName in response.headers) {
          console.log(headerName + " : " + response.headers[headerName]);
       }
       console.log("Response " + response.text );
    }
}).post();

但是错误是:

[Exception... "Component returned failure code: 0x80520009 (NS_ERROR_FILE_INVALID_PATH) [nsILocalFile.target]" nsresult: "0x80520009 (NS_ERROR_FILE_INVALID_PATH)" location: "JS frame :: resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/querystring.js :: stringify/< :: line 70" data: no]

我已尝试进行一些检查并且:

  1. 服务器开启并接收正常的 GET 和 POST 没有文件
  2. zip 文件存在且路径正确

您看到任何错误了吗? 非常感谢

使用 Request 模块完成此操作的唯一方法是将 base64 编码字符串作为 content 键的基础。如果你不使用它,那么你可以发送数据,例如 BlobDOMFile (new File()) 实例。

但是正如我们在 SDK 代码中看到的那样,请求模块根据请求发送 data 变量(如果它不是 HEAD 或 GET 请求)。

https://github.com/mozilla/addon-sdk/blob/master/lib/sdk/request.js#L110

data 变量由 运行 stringify 对传递给 content 键的任何内容进行生成: https://github.com/mozilla/addon-sdk/blob/master/lib/sdk/request.js#L76

Stringify 使它成为一个字符串: https://github.com/mozilla/addon-sdk/blob/f5fab7b242121dccfa4e55ac80489899bb9f2a41/lib/sdk/querystring.js#L30

所以你必须发送base64编码的字符串。或者二进制字符串。太烂了。

您可以使用 sdk/io 模块将文件读取为 ArrayBuffer,然后将 ArrayBuffer 转换为 base64 字符串或二进制字符串。

这显示了如何获取二进制字符串: