簡體   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