通过HTTP从PHP到Angular 6的二进制数据

时间:2018-12-27 22:03:51

标签: php angular binary-data

目标是从Angular 7向PHP发出一个HTTP请求(空),以接收Angular中的二进制数据以供protobuf3使用。 更具体地说,PHP(源代码)中的二进制数据(编码如下:https://developers.google.com/protocol-buffers/docs/encoding)封装在字符串中,而Angular中的目标是Uint8Array。

因此,我目前有以下工作代码:

PHP代码(一个简单的ProcessWire根模板):

header('Content-Type: application/b64-protobuf');
…
echo base64_encode($response->serializeToString());

角度:

let res = this.httpClient.get(`${this.API_URL}`, { responseType: 'text' });
  res.subscribe((data) => {

  let binary_string = atob(data);
  let len = binary_string.length;
  let bytes = new Uint8Array(len);
  for (let i = 0; i < len; i++) {
    bytes[i] = binary_string.charCodeAt(i);
  }

  let parsedResponse = pb.Response.deserializeBinary(bytes)      
})

如您所见,在发送数据之前,我将数据编码为base64。因此,它不如可能有效,因为base64减少了每个字符的信息量。我已经做了很多尝试来使二进制传输正常工作,但是最终数据总是被破坏,即变量bytesbase64_encode的参数不同。 但是,根据某些消息来源(例如PHP write binary responseBinary data corrupted from php to AS3 via http(没有人说这是不可能的)),

所以我的问题是:直接传输二进制数据必须更改什么?甚至有可能吗?

我尝试了什么?

  • 使用不同的标题,例如 header('Content-Type:binary/octet-stream;');或在Angular中使用Blob。
  • 我还尝试从PHP代码中删除base64_encodeatob 从角度代码。结果:数据的内容在serializeToStringdeserializeBinary(bytes)之间修改,这是不希望的。
  • 我检查了<?php之前的可能字符

规格:

  • PHP 7.2.11
  • Apache 2.4.35
  • 角度7.0.2

如果需要更多信息,请在评论中让我知道。我渴望提供它。谢谢。

0 个答案:

没有答案