2

我有一个 PHP 网络服务,它当前返回一个 zip 存档作为其唯一输出。我正在使用从磁盘读取 zip 存档file_get_contents并将其作为响应的正文发送回。

我希望它以 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 格式。如果我使用 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 响应中将原始数据块作为一个字段插入的好方法?

4

3 回答 3

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];
于 2012-11-29T17:27:52.297 回答
0

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

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

于 2012-11-29T17:34:58.663 回答
0

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

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

于 2012-11-29T17:13:35.377 回答