2010-09-01 59 views
1

我需要POST請求。該請求有3個參數,'email_id','位置'和'image_data'。 'image_data'的值包含UIImage的NSData jpeg表示。該請求必須使用multipart/form-data的內容類型提交。我如何創建NSMutableRequest發佈此請求?我應該如何設置邊界?是整個數據包所需的邊界,還是僅僅是圖像部分的邊界?UIImage使用NSMutable請求上傳

回答

2

如果我是你,我會檢查出ASIHTTPRequest庫。這是一個Cocoa的HTTP客戶端庫,它讓那些通過iPhone應用程序進行大量網絡交互的人們的生活變得更加容易。

下面是我使用ASIFormDataRequest(ASIHTTPRequest的一個組件)從我的iPhone應用程序上傳圖像。客戶對這些圖像的術語是「標記」 - 他們將在當地用戶拍攝的當地圖片地圖上進行搜索。用戶被邀請「做你的標記」。你可以想象隨之而來的快樂。

Anyhoo,self.mark是我的Mark類的一個實例,它封裝了我正在上傳的圖像和細節包的數據。我有一個數據管理器單身我在這個方法的第一行中使用,它包含當前的CLLocation,所以我可以獲取這張圖片的地理編碼信息。

注意我不關心編碼類型或多部分邊界。該庫處理所有這些。

-(void)completeUpload 
{ 
    CLLocation *currentLoc = [DataManager sharedDataManager].currentLocation; 
    self.mark.latitude = [NSNumber numberWithDouble:currentLoc.coordinate.latitude]; 
    self.mark.longitude = [NSNumber numberWithDouble:currentLoc.coordinate.longitude]; 

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL: 
            [NSURL URLWithString:[NSString stringWithFormat:@"%@image_upload.php", WEBAPPURL]]]; 


    [request setPostValue:self.mark.titleText forKey:@"title"]; 
    [request setPostValue:self.mark.descriptionText forKey:@"description"]; 
    [request setPostValue:self.mark.event.guid forKey:@"event"]; 
    [request setPostValue:self.mark.latitude forKey:@"latitude"]; 
    [request setPostValue:self.mark.longitude forKey:@"longitude"]; 
    [request setPostValue:self.mark.project forKey:@"project"]; 
[request setPostValue:[[NSUserDefaults standardUserDefaults] valueForKey:@"userID"] forKey:@"user_id"]; 
    request.timeOutSeconds = 120; 

    int i = 1; 
    for (NSString *tag in self.tags) { 
     [request setPostValue:tag forKey:[NSString stringWithFormat:@"tag-%d", i]]; 
     i++; 
    } 

    NSData *imageData = UIImagePNGRepresentation(self.mark.image); 
    NSData *thumbData = UIImagePNGRepresentation(self.mark.thumbnail); 
    [request setData:imageData forKey:@"file"]; 
    [request setData:thumbData forKey:@"thumb"]; 

    self.progress.progress = 20.0; 
    [request setUploadProgressDelegate:self.progress]; 
    request.showAccurateProgress = YES; 

    request.delegate = self; 
    [request startAsynchronous]; 
} 

編輯:順便說一句,我發佈到PHP腳本後面是HTTP身份驗證。 ASI緩存這些憑據,並且我提前提供了這些憑據,因此我不必在此再提供它們。我注意到,因爲否則,這篇文章和相應的PHP腳本被寫入的方式,任何人都可以僞造其他人的用戶ID值,並在他們的用戶名下發布任何內容。當你構建這樣的應用程序時,你必須考慮網絡應用程序安全性,與網站沒有區別。它實際上是一個網站,只是通過非傳統的客戶端瀏覽。

+0

感謝您的快速回復。但我不能在我的項目中使用像ASIHttpRequest這樣的第三部分庫。 – Aravind 2010-09-02 08:30:02

+0

這是爲什麼?這是一個學校任務嗎?真正的開發者重用代碼 – 2010-09-02 17:07:46

2
 
NSData *imageData=UIImageJPEGRepresentation(imageview.image, 1.0); 
NSString *[email protected]"nike.jpg" 

NSString *urlString = @"http://xyz.com/file_upload/file1.php"; 
NSMutableURLRequest *request =[[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 

    NSString *boundary = [NSString stringWithString:@"-----------------99882746641449"]; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

    NSMutableData *body = [NSMutableData data]; 
    NSMutableString * string = [[NSMutableString alloc] init]; 
    [string appendFormat:@"\r\n\r\n--%@\r\n", boundary]; 
    [string appendFormat:@"Content-Disposition: form-data; name=\"emailid\"\r\n\r\n"]; 
    [string appendFormat:@"[email protected]"]; //value 
    [body appendData:[string dataUsingEncoding:NSUTF8StringEncoding]]; // encrypt the entire body 

    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n",filename]] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[NSData dataWithData:imageData]]; 

    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [string release]; 

    [request setHTTPBody:body]; 
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];