有一个服务(php),可将图像发送到客户端(php)。
header('Content-Type: image/png');
readfile($image);
如果不仅需要发送图像,还需要发送一些数据怎么办?
$arrayToSend = [
'image' => file_get_contents($image),
'some_data' => [
'a' => 1,
'b' => 2
]
];
服务如何打包$ arrayToSend,以便客户端可以对其进行打包?
无需将图像转换为base64(因为尺寸太大)。
答案 0 :(得分:1)
也许您可以将some_data-b
和INFO] --- 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!';
}