Safari插件中的Javascript - 从XHR下载二进制文件数据,然后重新提交

时间:2011-08-10 15:58:37

标签: javascript safari xmlhttprequest

我正在尝试编写Safari扩展程序以获取用户已打开的PDF文档,然后通过POST将其提交到另一个站点。

我在Chrome中完成了这项工作,但复制相同的方法不起作用,因为Safari无法与BlobBuilder一起使用。

这适用于Chrome:

    var xhr = new XMLHttpRequest();
    xhr.open("GET", tab.url, true);

    xhr.responseType = "arraybuffer";

    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4 && xhr.status == 200)  {

            var bb = new BlobBuilder();
            bb.append(this.response); 

            var blob = bb.getBlob('application/pdf');

            var http = new XMLHttpRequest();

            http.open("POST", send_url, true);

            var formData = new FormData();
            formData.append("src", blob);
            http.send(formData);
        }

生成的POST与我的PHP脚本对话,在其$ _FILES数组中是我的文件。完美。

但我尝试的任何东西似乎都无法使用Safari。我尝试responseType='blob'开始,但这不起作用。我无法使用任何Safari JS文件对象来处理这些数据。我尝试将其更改为Uint8数组,但这没有提交数据,只是字符串"[object UInt8Array]"

有什么想法吗?

干杯! 贝

1 个答案:

答案 0 :(得分:2)

我得到了很好的结果,将responseType保持为'arraybuffer',然后将xhr.response传递到新的Uint8Array的构造函数中,在我的Mac上的Safari 5.1.1中完美运行:

xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
        buffer = new Uint8Array(xhr.response);
        for (var loop=0; loop<buffer.length; loop++) {
            // Do something with buffer[loop]
        }
    }
}
xhr.open('GET', 'yourfilename.here', true);
xhr.responseType = 'arraybuffer';
xhr.send();

我必须承认,在RTFM模式启动之前我尝试了“一两件事”,我发现MDN page on XMLHttpRequest有一节关于读取二进制数据(MDN是一个很好的资源)。

一旦我把它放到位,一切都开始奇迹般地发挥作用。