PHP-包含二进制数据的数组

时间:2019-05-27 15:17:55

标签: php image base64 pack

有一个服务(php),可将图像发送到客户端(php)。

header('Content-Type: image/png');
readfile($image);

如果不仅需要发送图像,还需要发送一些数据怎么办?

$arrayToSend = [
    'image' => file_get_contents($image),
    'some_data' => [
        'a' => 1,
        'b' => 2
    ]
];

服务如何打包$ arrayToSend,以便客户端可以对其进行打包?

无需将图像转换为base64(因为尺寸太大)。

2 个答案:

答案 0 :(得分:1)

也许您可以将some_data-bINFO] --- maven-[secure]-plugin:1.6:sign (sign-artifacts) @ spring-httpserver-timings --- [secure]: [secure]-agent is not available in this session [secure]: Sorry, no terminal at all requested - can't get input 作为标题传递?例如,作为cookie。

您可以自己准备本文档:https://developer.mozilla.org/pl/docs/Web/HTTP/Headers,以获取有关标题的更多信息。

答案 1 :(得分:1)

@Danon的标头方法可能是通过HTTP进行通信的方式,但是其他传输可能不支持发送其他标头,因此您需要将它们与二进制数据打包在一起,然后在接收端解压缩

<?php
class Codec
{
    /**
     * Pack metadata along with binary data
     *
     * @param $meta
     * @param $data
     * @return false|string
     */
    public static function encode($meta, $data)
    {
        $meta = base64_encode($meta);

        //determine length of metadata
        $metaLength = strlen($meta);

        //The first part of the message is the metadata length
        $output = pack('VA*', $metaLength, $meta);

        //Length and metadata are set, now include the binary data
        $output .= $data;

        return $output;
    }

    /**
     * Unpack data encoded via the encode function.
     * Returns an array with "meta" and "data" elaments
     *
     * @param $content
     * @return array
     */
    public static function decode($content)
    {
        //Get the length of the metadata content
        $metaLength = unpack('V', $content)[1];

        //Slice out the metatdata, offset 4 to account for the length bytes
        $metaPacked = substr($content, 4, $metaLength);

        //Unpack and base64 decode the metadata
        $meta = unpack('A*', $metaPacked)[1];
        $meta = base64_decode($meta);

        //The binary data is everything after the metadata
        $data = substr($content, $metaLength+4);

        return [
            'meta' => $meta,
            'data' => $data
        ];
    }
}

//Load contents of a binary file
$imageFilePath = 'path_to_image.png';
$data = file_get_contents($imageFilePath);

//Arbitrary metadata - could be anything, let's use JSON
$meta = [
    'filename' => 'foo.png',
    'uid' => 12345,
    'md5' => md5_file($imageFilePath)
];

$metaJson = json_encode($meta);

//Encode the message, you can then send this to the receiver
$payload = Codec::encode($metaJson, $data);

//Receiver decodes the message
$result = Codec::decode($payload);

//Decode our JSON string
$resultMeta = json_decode($result['meta'], true);


echo 'Filename: '.$resultMeta['filename'].PHP_EOL;
echo 'UID: '.$resultMeta['uid'].PHP_EOL;

//We included an MD5 hash of the file, so we can verify here
if($resultMeta['md5'] != md5($result['data']))
{
    echo 'MD5 mismatch!';
}