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

时间:2012-11-29 16:43:03

标签: php ios web-services zip webservice-client

我有一个PHP webservice,它目前只返回一个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编码,它会很愉快地对其进行编码,但我找不到在客户端上反转操作的方法(调用[dataString dataUsingEncoding:NSUTF8StringEncoding]然后将结果视为zip文件因BOM could not extract archive: Couldn't read pkzip local header而失败。

有人建议在JSON响应中将一小块原始数据作为一个字段插入一个好方法吗?

3 个答案:

答案 0 :(得分:0)

当然,如果您成功地将原始数据包含在JSON中,那么当您尝试解码JSON时,您会遇到相反的问题,而您用于解码的任何内容都无法处理原始数据?

相反,我建议您在响应正文中发送原始数据 ,并使用标头发送元数据。

答案 1 :(得分:0)

打这个问题。

事实证明,像这样的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];

答案 2 :(得分:0)

ZIP存档不是文字 - 它们是二进制文件!尝试将您的存档从ISO-8859-1转换为UTF-8与尝试旋转它一样有意义。

有几种算法将二进制流序列化为文本,但它们都会增加文件大小。如果这不是问题,请查看: