[英]Transmitting zip data as part of a webservice response / reversible mb_detect_encoding
我有一个PHP Web服务,当前返回一个zip归档文件作为其唯一输出。 我正在使用file_get_contents
从磁盘读取zip存档,并将其作为响应的正文发送回去。
我希望它以JSON格式返回一些其他元数据:
{
"generatedDate": "2012-11-28 12:00:00",
"status": "unchanged",
"rawData": <zip file in raw form>
}
与该服务通信的iOS应用将收到此响应,解析JSON,然后将zip文件存储在本地以供自己使用。
但是,如果我尝试将file_get_contents
的结果填充到json_encode中,则正确地抱怨该字符串不是UTF-8格式。 如果我使用mb_convert_encoding($rawData, 'UTF-8', mb_detect_encoding($rawData, 'UTF-8, ISO-8859-1', true));
对它进行UTF-8编码mb_convert_encoding($rawData, 'UTF-8', mb_detect_encoding($rawData, 'UTF-8, ISO-8859-1', true));
,它将愉快地对其进行编码,但是我找不到一种在客户端上进行反向操作的方法(调用[dataString dataUsingEncoding:NSUTF8StringEncoding]
,然后将结果视为zip文件失败,而BOM could not extract archive: Couldn't read pkzip local header
。
谁能建议一种将原始数据的大块作为一个字段插入JSON响应的好方法吗?
当然,如果您成功地将原始数据包含在JSON中,那么另一端会遇到相反的问题,当您尝试解码JSON时,您用来解码的任何内容都无法处理原始数据?
相反,我建议您仅在响应正文中发送原始数据,并使用标头发送元数据。
提出这个问题。
事实证明,像这样对UTF-8编码的原始数据充其量是非标准的,标准解决方案是对base-64进行编码,然后使用base-64解码器在客户端上对其进行恢复:
$this->response(200, array('rawData' => base64_encode($rawData)));
...
NSString *rawDataString = [[response responseJSON] objectForKey:@"rawData"];
NSData *rawData = [Base64 decode:rawDataString];
ZIP档案不是文本,而是二进制文件! 尝试将存档从ISO-8859-1转换为UTF-8就像尝试旋转存档一样有意义。
有几种算法可以将二进制流序列化为文本,但是它们都会增加文件的大小。 如果这不是问题,请查看:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.