通过HTTP在JavaScript中发送二进制数据
我试图发送一个HTTP POST到我的networking上的设备。 我想发送四个特定字节的数据到设备,不幸的是我似乎只能发送string到设备。 反正有使用JavaScript发送原始二进制文件?
这里是我用来做POST的脚本,除非我在数据字段中放入一个string,否则它现在不会运行。 有任何想法吗?
(function ($) { $.ajax({ url: '<IP of Address>', type: 'POST', contentType: 'application/octet-stream', //data:'253,0,128,1', data:0xFD008001, crossDomain: true }); })(jQuery);
默认情况下,jQuery序列化数据(传入data
属性) – 这意味着0xFD008001
数字作为'4244668417' string (10字节,而不是4)传递到服务器,这就是为什么服务器对待它不是预期的。
有必要通过将$.ajax
属性processData
设置为false
来防止这种行为:
默认情况下,作为对象传递给数据选项的数据(技术上,除了string以外的任何东西)将被处理并转换为查询string,以适应默认的内容types“application / x-www-form-urlencoded” 。 如果要发送DOMDocument或其他未处理的数据,请将此选项设置为false。
…但这只是整个故事的一部分: XMLHttpRequest.send
实现有其自己的限制 。 这就是为什么你最好的select,我想是使用TypedArrays制作你自己的序列化程序 :
// Since we deal with Firefox and Chrome only var bytesToSend = [253, 0, 128, 1], bytesArray = new Uint8Array(bytesToSend); $.ajax({ url: '%your_service_url%', type: 'POST', contentType: 'application/octet-stream', data: bytesArray, processData: false });
或者完全不使用jQuery:
var bytesToSend = [253, 0, 128, 1], bytesArray = new Uint8Array(bytesToSend); var xhr = new XMLHttpRequest(); xhr.open('POST', '%your_service_url%'); xhr.setRequestHeader('Content-Type', 'application/octet-stream'); xhr.send(bytesArray);
您可以通过ajax发送二进制数据与xhr2,您可以发送数据作为一个types的数组或blob 。
(function ($) { var data = new Uint32Array(1); data[0] = 0xFD008001; $.ajax({ url: '<IP of Address>', type: 'POST', contentType: false, processData: false, //data:'253,0,128,1', data:data, crossDomain: true }); })(jQuery);
https://developer.mozilla.org/en-US/docs/Web/API/Uint32Array
你可以使用atob()
和btoa()
:
var data = new Uint32Array(1); data[0] = 0xFD008001; atob(data)
这将您的二进制数据转换为可以作为文本发送的base64string。