2012-05-29 74 views
2

我想了解如何使用http POST和我當前的客戶機 - 服務器協議設計發送圖像。 從客戶端到服務器的所有消息看起來像下面的示例,有一個帶參數cmd的cmd字符串以及該命令的一些更相關的參數。目標c - 通過http發送圖像POST POST

例如,這是我如何發送短信到服務器:

- (void)sendMessagesWithText:(NSString *)text fromUser:(NSString *)userId 
{ 
    NSString *url = SERVER_URL; 

    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
    [request setURL:[NSURL URLWithString:url]]; 
    [request setHTTPMethod:@"POST"]; 

    NSMutableData *body = [NSMutableData data]; 

    [body appendData:[[NSString stringWithFormat:@"cmd=%@&userid=%@&msgtext=%@", 
         @"sendmessage", 
         userId, 
         text] dataUsingEncoding:NSUTF8StringEncoding]]; 


    [request setHTTPBody:body]; 

    // send to server 
    [[NetworkHelper sharedManager] sendRequest:request]; 
} 

現在我想使用戶能夠同時發送圖像,但我怎麼跟我的協議設計發送?我應該只是將圖像追加到cmd字符串後的身體?

回答

6

你需要用後的multipart/form-data的。

這裏是現已解散的ASI的例子:發送與ASIFormDataRequest

形式張貼到與網頁的形式,使用附帶的ASIFormDataRequest子兼容的方式發送POST數據Creating and running requests

。上傳二進制數據或文件時,數據以'application/x-www-form-urlencoded'格式或'multipart/form-data'格式發佈。文件中的數據根據​​需要從磁盤中讀取,因此只要您的Web服務器設置爲處理它們,發佈大型文件即可。

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request setPostValue:@"Ben" forKey:@"first_name"]; 
[request setPostValue:@"Copsey" forKey:@"last_name"]; 
[request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"]; 

ASIFormDataRequest將自動檢測文件的mime類型(在iOS 3.0或更高版本的蘋果機)經由setFile加入到POST:forKey :,和包括此在發送到服務器的MIME頭。如果你願意,你可以使用更長的形式來覆蓋此:


Multipart/form-data很爛。相信我,我已經在數年前用C++實現了它。讓別人去做骯髒的工作。

但是,如果你仍然想單獨去。我找到了thisthis。祝你好運。

+0

ASIHTTPRequest是一個很棒的圖書館。 –

+0

我不想僅爲這一種方法使用庫。你能告訴我該怎麼做嗎? – Eyal

+0

我已經更新了我的答案。我希望它警告你遠離嘗試。 –

4

只需附加一個NSData版本的圖像到POST正文。

[body appendData:[[NSString stringWithFormat:@"cmd=%@&userid=%@&msgtext=%@", @"sendmessage&image=", userId, text] dataUsingEncoding:NSUTF8StringEncoding]]; 

[body appendData: UIImagePNGRepresentation((UIImage *) myImage)]; 

但是,它可能是更容易尋找到ASIHTTPRequest,與,你可以使用:

[request setPostValue:myImageData forKey:@"image"]; 
+0

對於其他人將頭撞向牆壁,應該首先詢問服務器人員需要什麼。在我的情況下,服務器端需要一個正常的文件,所以[body appendData:UIImagePNGRepresentation((UIImage *)myImage)];工作正常,但在某些情況下需要多部分請求。我花了整晚,並沒有成功,因爲我使用了多部分請求,但需要一個正常的appednData。呃! – Nil