2009-10-29 100 views
13

嗨我想知道是否有任何流在AJAX二进制响应?这将是一个终极解决方案,否则我需要将二进制映像实现为文件,然后使用不同的URL将该文件流式传输给用户。阿贾克斯二进制响应

new Ajax.Request('/viewImage?id=123', { 
    // request returns a binary image inputstream 
    onSuccess: function(transport) { 
     // text example 
     // alert(transport.responseText) 

     // QUESTION: is there a streaming binary response? 
     $('imgElem').src = transport.responseBinary; 
    }, 
    onFailure: function(transport) { 
     // handle failure 
    } 
}); 

回答

1

你可以发送任何你想要的回应,纯文本,HTML,图像......无论如何!这取决于你如何处理它,当你收到它。

但是...您不能将一个二进制图像分配给src属性的<IMG>。你最好只是将URL返回给图像,然后指定它 - 老实说,在SRC中嵌入图像时有一些编码,但它们不是跨浏览器的,所以你想要远离它们。

4

你能做什么,如果你想在飞行中产生的图像,是刚做:

<img src="http://myurl/myfile.php?id=3" /> 

那么你就可以用适当的MIME类型发送数据。

如果您确实想要发送图片,那么您可能需要查看HTML5 canvas标签,但我不确定excanvas如何处理这个问题,因为它是跨平台的。

您可以写入画布,但使用img标签会更高效。

21

它可能不可能二进制数据,但您可以使用Ajax检索二进制数据。

这是可能的使用两种方法之一:Javascript Typed Arrays或XMLHttpResponse overrideMimeType黑客入侵。对MDN的好文章的读 - 这些例子都存放于此:Sending and Receiving Binary Data

的类型数组的方法是这样的:

var oReq = new XMLHttpRequest(); 
oReq.open("GET", "/myfile.png", true); 
oReq.responseType = "arraybuffer"; 

oReq.onload = function (oEvent) { 
    var arrayBuffer = oReq.response; // Note: not oReq.responseText 
    if (arrayBuffer) { 
    var byteArray = new Uint8Array(arrayBuffer); 
    for (var i = 0; i < byteArray.byteLength; i++) { 
     // do something with each byte in the array 
    } 
    } 
}; 

oReq.send(null); 

类型数组没有在IE < 10支持,火狐< 4 ,Chrome < 7,Safari < 5.1和Opera < 11.6和mobile support is shaky but improving

第二种方法使用名为overrideMimeType的XMLHttpRequest方法允许二进制数据通过未经修改的方式传递。

var req = new XMLHttpRequest(); 
req.open('GET', '/myfile.png', false); 
// XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com] 
req.overrideMimeType('text\/plain; charset=x-user-defined'); 
req.send(null); 
if (req.status != 200) return ''; 
// do stuff with req.responseText; 

你会得到一个未解析二进制字符串,在其中您可以使用var byte = filestream.charCodeAt(x) & 0xff;检索特定字节。

+2

这应该被接受为答案。 – Pacerier 2013-03-08 12:13:02

+1

为什么''text \/plain; charset = x-user-defined''而不是例如''text \/plain \; \ charset \ = x \ -user \ -defined''或''text/plain; charset = x-user-defined''? :) – mykhal 2014-09-26 10:49:26

6

这是对汤姆阿什沃思的回应(这有助于让我在正面临的问题上走上正轨)的延伸。这可以让你获得文件流(FileStreamResult,如果你使用的是asp.net mvc)并将其设置为img src,这很酷。

var oReq = new XMLHttpRequest(); 
oReq.open("post", '/somelocation/getmypic', true);   
oReq.responseType = "blob"; 
oReq.onload = function (oEvent) 
{ 
    var blob = oReq.response; 
    var imgSrc = URL.createObjectURL(blob);       
    var $img = $('<img/>', {     
     "alt": "test image", 
     "src": imgSrc 
    }).appendTo($('#bb_theImageContainer')); 
    window.URL.revokeObjectURL(imgSrc); 
}; 
oReq.send(null); 

的基本思想是将数据返回篡改,,它被放置在一个斑点,然后创建链接直接在存储器中该对象。见herehere。请注意支持的浏览器。