从 Firefox sdk 文件系统获取 javascript 文件对象

Get a javascript File object from Firefox sdk file system

我需要以 javascript 文件对象的形式将文件发送到服务器。如果我发送二进制数据,它只会显示为已损坏。我上周让它工作了,但最新的 firefox 更新似乎阻止了脚本 运行.

上周有效的代码:

function readLocalFiles(file) {
    return new Promise(function (done, error) {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", 'file:///' + file.path);
        xhr.responseType = "blob";
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                var fileObj = xhr.response;
                fileObj.name = file.name;
                done(fileObj);
            }
        }
        xhr.onerror = function () {
            alert('fudge');
        }
        xhr.send();
    });
}

我已将 "file:///" 添加到 package.json 文件的权限中以防万一。 我也在这里尝试过这个例子: - https://developer.mozilla.org/en-US/docs/Extensions/Using_the_DOM_File_API_in_chrome_code

我可以使用 require("sdk/io/file") 获取文件二进制数据,但不知道如何将其转换为 File 对象,我在网上看到一些 post 关于将二进制文件转换为数组缓冲区并将其作为 blob 传递,例如:https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String?hl=en,但文件已损坏。

此插件仅供内部使用,所以我不担心访问用户本地文件可能引起的任何安全问题。该脚本基本上循环遍历指定目录并抓取图像并将其上传到服务器。

编辑:

我刚刚发现 file:/// 调用在使用 jpm 运行 时有效,但在编译插件时无效。忽略我下面的评论,仍在尝试解决这个问题。

已找到解决方案,尽管出于安全原因不是最佳解决方案。

我的原始设置之所以有效,是因为 运行在 jpm 运行 中使用它,但在编译时它会失败。我想在 jpm 运行 模式下它允许本地文件访问,所以为了模仿编译后我将 firefox 设置 security.fileuri.strict_origin_policy 设置为 false.

只需要记得在完成后将其设置回去。我也可以尝试更新代码以使用 preferences/service api 为我打开和关闭它。

当您对文件 uri 进行 XHR 时,readyState 总是 returns 0,但它确实会加载,如此处所示 -