繁体   English   中英

传输zip数据作为Web服务响应的一部分/可逆mb_detect_encoding

[英]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.

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