Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Safari插件中的Javascript-从XHR下载二进制文件数据,然后重新提交_Javascript_Safari_Xmlhttprequest - Fatal编程技术网

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

Safari插件中的Javascript-从XHR下载二进制文件数据,然后重新提交,javascript,safari,xmlhttprequest,Javascript,Safari,Xmlhttprequest,我正试图编写一个Safari扩展来获取用户打开的PDF文档,然后通过POST将其提交到另一个站点 我已经在Chrome中实现了这一点,但是复制相同的方法不起作用,因为Safari不适用于BlobBuilder 这就是Chrome的工作原理: var xhr = new XMLHttpRequest(); xhr.open("GET", tab.url, true); xhr.responseType = "arraybuffer"; xhr.onreadyst

我正试图编写一个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脚本对话,在其$\u FILES数组中是我的文件。太好了

但使用Safari时,我尝试的方法似乎完全无效。我试着从
responseType='blob'
开始,但没有成功。我无法让任何Safari JS文件对象处理此数据。我尝试将其更改为Uint8数组,但这没有提交数据,只是字符串说
“[object UInt8Array]”

有什么想法吗

干杯!
Tony

我将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();
xhr=newXMLHttpRequest();
xhr.onreadystatechange=函数(){
if(xhr.readyState==4){
buffer=新的Uint8Array(xhr.response);

对于(var loop=0;loop您真的让Safari上传二进制数据了吗?向
FormData
对象添加
ArrayBuffer
会导致它提交格式不正确的多部分表单,因此服务器会将整个文件内容报告为
----WebKitFormBoundaryaiKF2ZGx25JiZdKY-->/code>。但这比任何其他尝试都要多,在那里狩猎队什么也没送。