JavaScript从服务器获取二进制数据,responseType="arraybuffer",在ie上报错:InvalidStateError,求解答

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript从服务器获取二进制数据,responseType="arraybuffer",在ie上报错:InvalidStateError,求解答相关的知识,希望对你有一定的参考价值。

刚开始学Js,希望大神能帮一下:
代码在Chrom上成功,ie上不行:
function getByRequest(url)
var xhr = new XMLHttpRequest();
xhr.responseType = "arraybuffer";
xhr.open("GET", url, true);
xhr.overrideMimeType("text/plain; charset=x-user-defined");
xhr.onreadystatechange = function ()
if (xhr.readyState === 4 && xhr.status === 200)
arraybuffer = xhr.response;
dataView = new DataView(arraybuffer);
var building = resolve();


xhr.send(null);
ie上是有什么特殊写法吗?

IE5或者IE6需要判断使用的方法,但是这里面还有一个关键点是,responseType的设置在IE上不能在open之前设置,否则会异常InvalidStateError 参考技术A var xhr = new XMLHttpRequest();

要改为:
if(window.XMLHttpRequest)
var xhr=new XMLHttpRequest();
else if(window.ActiveXObject)
try
var xhr=new ActiveXObject("Msxml2.XMLHTTP");
catch(e)
try
var xhr= new ActiveXObject("Microsoft.XMLHTTP");
catch(e)
return "";


else
return "";


补充说明:IE不支持 XMLHttpRequest本回答被提问者和网友采纳

如何在 JavaScript ajax 调用中从 PHP passthru 获取二进制数据?

【中文标题】如何在 JavaScript ajax 调用中从 PHP passthru 获取二进制数据?【英文标题】:How can I get binary data from PHP passthru in JavaScript ajax call? 【发布时间】:2016-03-18 19:33:18 【问题描述】:

我想用 JavaScript 从服务器获取音频文件并播放它。但是我的代码中的 ajax 调用似乎从来没有回调,我也不确定我是否正确处理了 JavaScript 中的音频。

以下 PHP 文件返回服务器上的音频文件:

<?php
  header('Access-Control-Allow-Origin: *');
  $name = './audiofiles/audio.wav';
  $fp = fopen($name, 'rb');
  header("Content-Type: binary");
  header("Content-Length: " . filesize($name));
  fpassthru($fp);
  exit;
?>

使用 ajax 从 JavaScript 调用脚本,并在浏览器中重放返回的音频数据(至少应该是这样):

function playSample(e,q) 
  console.log("requesting audio from server")
  $.ajax(
    url: "https://audioserver.com/getaudio.php",
    type: "GET",
    dataType: "arraybuffer",
    processData: false,
    success: function(result)
      console.log("received audio, starting to play now")
      var buffers = result;
      var newSource = audioContext.createBufferSource();
      var newBuffer = audioContext.createBuffer( 2, buffers[0].length, 16000 );
      newBuffer.getChannelData(0).set(buffers[0]);
      newSource.buffer = newBuffer;
      newSource.connect( audioContext.destination );
      newSource.start(0);
    
  );

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

jQuery ajax 不支持类型化响应,因此您将在成功回调中获取文本。

您可以使用纯 XMLHTTPRequest 获取二进制响应

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function()
    if (this.readyState == 4 && this.status == 200)
        //this.response is the array buffer for you to manipulate
    

xhr.open('GET', 'https://audioserver.com/getaudio.php');
xhr.responseType = 'arraybuffer';
xhr.send();      

还有一个插件可以修补 jquery 以支持它https://github.com/acigna/jquery-ajax-native

您的音频处理代码也看起来不正确。 buffers[0] 没有意义,因为数组缓冲区没有数字属性

【讨论】:

我根据您的建议调整了我的代码,现在我收到一个错误,即音频无法解码。任何想法如何解决这个问题?在@Musa 上方查看我的编辑 @user2212461 请不要完全改变问题。你可以做两件事之一。 1. 提出一个新问题或 2. 在问题底部添加一个编辑部分,其中包含您所做的更改。 在这里添加了我的后续问题:***.com/questions/36093768/…@Musa

以上是关于JavaScript从服务器获取二进制数据,responseType="arraybuffer",在ie上报错:InvalidStateError,求解答的主要内容,如果未能解决你的问题,请参考以下文章

Express - 从 Web 服务返回二进制数据

使用 JavaScript/jQuery 从输入类型“文件”中获取二进制图像数据,以便在 WebMatrix 中使用 AJAX 进行图片预览 [重复]

Javascript - 从文件中获取Vue js

从网页上抓取图片

如何让 HLS.js 从服务器端获取数据?

如何在 javascript fetch() 方法上传递带有 url 的变量?