慕森卡
如果您通过 HTTP 通信,@Danon 的标头方法可能是要走的路,但其他传输可能不支持发送额外的标头,因此您需要将它们与二进制数据一起打包,然后在接收端解包。<?phpclass 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 hereif($resultMeta['md5'] != md5($result['data'])){ echo 'MD5 mismatch!';}