2009-10-29 98 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。請注意支持的瀏覽器。