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