繁体   English   中英

通过JavaScript XHR2对象在PHP中发送ArrayBuffer

[英]Sending an ArrayBuffer in PHP through JavaScript XHR2 object

在这里,我正在编写基于XHR2支持的promises的AJAX库的新版本( https://github.com/pyrsmk/qwest )。 我目前正在编写单元测试,现在该库的95%都很强大。 无论如何,我需要验证我们是否可以成功检索ArrayBuffer(XHR2支持'arraybuffer'响应类型),但是如何使用PHP生成此ArrayBuffer? 我使用什么协议? Base64编码?

我真的不知道该如何处理整个事情...

编辑:似乎当我将ArrayBuffer发送到PHP时,数据直接由$ _POST变量处理

介绍

好吧,您不会发送“ ArrayBuffer”。 您发送的是数据,并指定一种使该数据有意义的格式。 然后,客户可以选择最佳的解释方式。

因此, ArrayBuffer只是数据(二进制数据)的通用定长容器 ,使您能够使用JavaScript类型的数组创建基础数据的“视图”。 很棒的事情是可以从单个ArrayBuffer源创建多个视图。


话虽这么说,在您的特定情况下,您可以使用PHP发送二进制数据的方式与使用PHP发送任何数据的方式相同。

例:

server.php

$filename = 'img.png';
$fsize = filesize($filename);

$handle = fopen($filename, "rb");
$contents = fread($handle, $fsize);
fclose($handle);

header('content-type: image/png');
header('Content-Length: ' . $fsize);

echo $contents;

或更短

$filename = 'img.png';

header('content-type: image/png');
header('Content-Length: ' . filesize($filename));

readfile($filename);

client.js

var xhr = new XMLHttpRequest();

xhr.open('GET', 'server.php', true);
xhr.responseType = 'arraybuffer';

xhr.onload = function(e) {
    var uInt8Array = new Uint8Array(this.response);
    console.log(uInt8Array);
};

xhr.send();

在php中处理二进制数据有些棘手。 要响应ArrayBuffer,必须将其转换为二进制字符串,并使用echo语句生成结果。

要从8位数组生成二进制字符串,必须使用pack语句。 如果服务器不支持PHP 5.6+版本,则可以转换每个数组项,并使用点运算符进行连接:

server.php

<?php
    header('content-type: application/octet-stream');

    $arrayBuffer = array(0, 1, 2, 253, 254, 255);

    $binary = "";
    for($index = 0; $index < count($arrayBuffer); $index++)
    {
        $binary = $binary.pack("C*", $arrayBuffer[$index]);
    }

    echo $binary;
?>

原始数据的MIME类型是application / octet-stream JavaScript代码的客户端看起来像:

client.js

let xmlRequest = new XMLHttpRequest();
xmlRequest.open('POST', 'server.php');
xmlRequest.responseType = 'arraybuffer';
xmlRequest.onload = event =>
{
    let arrayBuffer = new Uint8Array(event.target.response);
    console.log('arrayBuffer: ', arrayBuffer); // [0, 1, 2, 253, 254, 255];
};
xmlRequest.send();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM