Sending and Receiving Binary Data

2016.08.06 11:13

졸리운_곰 조회 수:83

Sending and Receiving Binary Data

Receiving binary data using JavaScript typed arrays

The responseType property of the XMLHttpRequest object can be set to change the expected response type from the server. Possible values are the empty string (default), "arraybuffer", "blob", "document", "json", and "text". The response property will contain the entity body according to responseType, as an ArrayBuffer, Blob, Document, JSON, or string. This is null if the request is not complete or was not successful.

This example reads an image as a binary file and creates an 8-bit unsigned integer array from the raw bytes. Note that this will not decode the image and read the pixels. You will need a png decoding library for that.

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);

An alternative to the above method utilizes the Blob interface to directly construct a Blob with the arraybuffer data.

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

oReq.onload = function(oEvent) {
  var blob = new Blob([oReq.response], {type: "image/png"});
  // ...
};

oReq.send();

Also you can read a binary file as a Blob by setting the string "blob" to the responseType property.

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

oReq.onload = function(oEvent) {
  var blob = oReq.response;
  // ...
};

oReq.send();

Receiving binary data in older browsers

The load_binary_resource() function shown below loads binary data from the specified URL, returning it to the caller.

function load_binary_resource(url) {
  var req = new XMLHttpRequest();
  req.open('GET', url, 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 '';
  return req.responseText;
}

The magic happens in line 5, which overrides the MIME type, forcing the browser to treat it as plain text, using a user-defined character set. This tells the browser not to parse it, and to let the bytes pass through unprocessed.

var filestream = load_binary_resource(url);
var abyte = filestream.charCodeAt(x) & 0xff; // throw away high-order byte (f7)

The example above fetches the byte at offset x within the loaded binary data. The valid range for x is from 0 to filestream.length-1.

See downloading binary streams with XMLHttpRequest for a detailed explanation. See also downloading files.

Receiving binary data anywhere

jBinary library for working with binary data in JavaScript allows to load data from any source with automatically detected best supported way on current browser or Node.js:

jBinary.load(url).then(function (binary) {
  // here you can use `binary` instance to parse data  
  // in any format (string, array of bytes, custom structure etc.)
});

Sending binary data

The send method of the XMLHttpRequest has been extended to enable easy transmission of binary data by accepting an ArrayBuffer, Blob, or File object.

The following example sends creates a text file on-the-fly and uses the POST method to send the "file" to the server. This example uses plain text, but you can imagine the data being a binary file instead.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

var oReq = new XMLHttpRequest();
oReq.open("POST", url, true);
oReq.onload = function (oEvent) {
  // Uploaded.
};

var blob = new Blob(['abc123'], {type: 'text/plain'});

oReq.send(blob);

Sending typed arrays as binary data

You can send JavaScript typed arrays as binary data as well.

var myArray = new ArrayBuffer(512);
var longInt8View = new Uint8Array(myArray);

for (var i=0; i< longInt8View.length; i++) {
  longInt8View[i] = i % 255;
}

var xhr = new XMLHttpRequest;
xhr.open("POST", url, false);
xhr.send(myArray);

This is building a 512-byte array of 8-bit integers and sending it; you can use any binary data you'd like, of course.

Note: Support for sending ArrayBuffer objects using XMLHttpRequest was added to Gecko 9.0 (Firefox 9.0 / Thunderbird 9.0 / SeaMonkey 2.6). Add information about other browsers' support here.

Submitting forms and uploading files

Please, read this paragraph.

Firefox-specific examples

This example transmits binary content asynchronously, using the POST method, and Firefox's non-standard sendAsBinary().

var req = new XMLHttpRequest();
req.open("POST", url, true);
// set headers and mime-type appropriately
req.setRequestHeader("Content-Length", 741);
req.sendAsBinary(aBody);

Line 4 sets the Content-Length header to 741, indicating that the data is 741 bytes long.  Obviously you need to change this value based on the actual size of the data being sent.

Line 5 uses the sendAsBinary() method to initiate the request.

Note: This non-standard sendAsBinary method is considered deprecated as of Gecko 31 (Firefox 31 / Thunderbird 31 / SeaMonkey 2.28) and will be removed soon. The standard send(Blob data) method can be used instead as explained above.

You can also send binary content by passing an instance of the nsIFileInputStream to send(). In that case, you don't have to set the Content-Length header yourself, as the information is fetched from the stream automatically:

// Make a stream from a file.
var stream = Components.classes["@mozilla.org/network/file-input-stream;1"]
                       .createInstance(Components.interfaces.nsIFileInputStream);
stream.init(file, 0x04 | 0x08, 0644, 0x04); // file is an nsIFile instance   

// Try to determine the MIME type of the file
var mimeType = "text\/plain";
try {
  var mimeService = Components.classes["@mozilla.org/mime;1"]
          .getService(Components.interfaces.nsIMIMEService);
  mimeType = mimeService.getTypeFromFile(file); // file is an nsIFile instance
}
catch (oEvent) { /* eat it; just use text/plain */ }

// Send    
var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
                    .createInstance(Components.interfaces.nsIXMLHttpRequest);
req.open('PUT', url, false); /* synchronous! */
req.setRequestHeader('Content-Type', mimeType);
req.send(stream);

 

[출처] https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
458 RESTful API를 설계하기 위한 디자인 팁 졸리운_곰 2016.08.09 88
457 무료로 배우는 공부 및 강좌 사이트 모음 정리 file 졸리운_곰 2016.08.07 973
» Sending and Receiving Binary Data 졸리운_곰 2016.08.06 83
455 Sending binary data along with a REST API request 졸리운_곰 2016.08.06 147
454 BSON 이해하기 졸리운_곰 2016.08.06 94
453 칸반과 큰 시각화 차트(Kanban Boards and Big Visible Charts) file 졸리운_곰 2016.07.19 350
452 [번역] 잘 가요 스크럼, 반가워요 칸반 file 졸리운_곰 2016.07.19 97
451 개인 Todo List를 애자일로 실행하기 file 졸리운_곰 2016.07.19 156
450 [펌] 만화로 보는 칸반보드 file 졸리운_곰 2016.07.19 3670
449 HTTP 프로토콜 집중탐구[1] 졸리운_곰 2016.07.18 477
448 HTTP 프로토콜 분석 file 졸리운_곰 2016.07.18 127
447 머신러닝 튜토리얼 총모음 : Machine Learning & Deep Learning Tutorials 졸리운_곰 2016.06.11 903
446 network based software design.pdf file 졸리운_곰 2016.06.06 119
445 What Is WP-AppKit? file 졸리운_곰 2016.06.01 134
444 Design Pattern 정리 (헤드퍼스트 디자인 패턴) file 졸리운_곰 2016.05.30 222
443 ontology tool 온톨로지 툴 스탠퍼드 오픈소스 졸리운_곰 2016.05.30 105
442 온톨로지와 추론 2011.06.29 file 졸리운_곰 2016.05.30 206
441 OWL 웹 온톨로지 언어 개요 file 졸리운_곰 2016.05.30 362
440 Observer in Java 2 졸리운_곰 2016.05.30 80
439 Observer in Java 졸리운_곰 2016.05.30 160
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED