Php 作为webservice响应/可逆mb_检测编码的一部分传输zip数据
我有一个PHP Web服务,它当前返回一个zip存档作为它的唯一输出。我正在使用Php 作为webservice响应/可逆mb_检测编码的一部分传输zip数据,php,ios,web-services,zip,webservice-client,Php,Ios,Web Services,Zip,Webservice Client,我有一个PHP Web服务,它当前返回一个zip存档作为它的唯一输出。我正在使用file\u get\u contents从磁盘读取zip归档文件,并将其作为响应主体发送回去 我希望它以JSON格式返回一些额外的元数据: { "generatedDate": "2012-11-28 12:00:00", "status": "unchanged", "rawData": <zip file in raw form> } { “生成日期”:“2012-11-2
file\u get\u contents
从磁盘读取zip归档文件,并将其作为响应主体发送回去
我希望它以JSON格式返回一些额外的元数据:
{
"generatedDate": "2012-11-28 12:00:00",
"status": "unchanged",
"rawData": <zip file in raw form>
}
{
“生成日期”:“2012-11-28 12:00:00”,
“状态”:“未更改”,
“原始数据”:
}
与此服务对话的iOS应用程序将收到此响应,解析JSON,然后将zip文件存储在本地供自己使用
但是,如果我试图将file\u get\u contents
的结果填充到json\u encode中,它会理所当然地抱怨字符串不是UTF-8格式。如果我使用mb\u convert\u编码($rawData,'UTF-8',对其进行UTF-8编码,
mb_检测_编码($rawData,'UTF-8,ISO-8859-1',true))
,它将愉快地对其进行编码,但我找不到一种方法来逆转客户端上的操作(调用[dataString dataUsingEncoding:NSUTF8StringEncoding]
,然后将结果视为zip文件失败,原因是BOM无法提取存档:无法读取pkzip本地头文件
有人能提出一个好方法,在JSON响应中插入一块原始数据作为一个字段吗?当然,如果您成功地将原始数据包含在JSON中,那么在另一端,当您尝试解码JSON时,您会遇到相反的问题,无论您使用什么来解码都无法处理原始数据 相反,我建议您只在响应正文中发送原始数据,并使用标题发送元数据。回答这个问题 事实证明,像这样对原始数据进行UTF-8编码充其量是不标准的,标准解决方案是对其进行base-64编码,然后使用base-64解码器在客户端上恢复:
$this->response(200, array('rawData' => base64_encode($rawData)));
ZIP存档文件不是文本文件,而是二进制文件!尝试将存档文件从ISO-8859-1转换为UTF-8与尝试旋转存档文件一样有意义 有几种将二进制流序列化为文本的算法,但它们都会增加文件大小。如果这不是问题,请查看:
NSString *rawDataString = [[response responseJSON] objectForKey:@"rawData"];
NSData *rawData = [Base64 decode:rawDataString];