2013-12-17 25 views
0

我想上傳一個圖像以及一些表單域。我可以使用以下鏈接將圖像上傳到服務器作爲參考。POST方法發送帖子變量和圖像到php服務器

File Upload to HTTP server in iphone programming

但如果我嘗試與圖像一起發送某種形式的字段我的錯誤響應。這裏是我正在使用的代碼

-(void)saveData{ 
NSString *urlString = @"Sample url"; 
    NSString *filename = @"filename"; 
    NSMutableURLRequest *request= [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:urlString]]; 
    [request setHTTPMethod:@"POST"]; 
    NSString *boundary = @"---------------------------14737809831466499882746641449"; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 
    NSMutableData *postbody = [NSMutableData data]; 
    [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [postbody appendData:[self generateDataFromText:FORM DATA IN JSON fieldName:@"add_product"]]; 
    [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"files\"; filename=\"%@.jpg\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [postbody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [postbody appendData:[NSData dataWithData:fileData]]; 
    [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [request setHTTPBody:postbody]; 
    [request setValue:APIKEY forHTTPHeaderField:@"X-API-KEY"]; 

    NSURLResponse *urlResp; 
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResp error:nil]; 
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 
    NSHTTPURLResponse *resp = (NSHTTPURLResponse *) urlResp; 
    NSLog(@"status code: %ld, response string: %@",(long)[resp statusCode],returnString); 
} 

-(NSMutableData *)generateDataFromText:(NSString *)dataText fieldName:(NSString *)fieldName 
{ 
    NSString *post = [NSString stringWithFormat:@"--AaB03x\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n", fieldName]; 
    // Get the post header int ASCII format: 
    NSData *postHeaderData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    // Generate the mutable data variable: 
    NSMutableData *postData = [[NSMutableData alloc] initWithLength:[postHeaderData length]]; 
    [postData setData:postHeaderData]; 
    NSData *uploadData = [dataText dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    // Add the text: 
    [postData appendData: uploadData]; 
    // Add the closing boundry: 
    [postData appendData: [@"\r\n" dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]]; 
    // Return the post data: 
    return postData; 
} 

所以有人請幫助我發送表單數據以及圖像到PHP服務器使用POST方法。提前致謝。

回答

0

每個字段都應位於自己的邊界@「\ r \ n - %@ \ r \ n」。因此,進行以下更改以使代碼正常工作。

刪除行:

[postbody appendData:[self generateDataFromText:FORM DATA IN JSON fieldName:@"add_product"]]; 

併線後

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

把下面的代碼:

[postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; add_product=\"%@\"\r\n\r\n",key] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postbody appendData:[[self generateDataFromText:FORM DATA IN JSON] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postbody appendData:[[NSString stringWithString:@"\r\n--%@\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 

每一個領域,你需要添加這些4行。

您應該考慮改用AFNetworking。它很容易工作。

讓它與AFNetworking一起工作非常簡單。添加AFNetworking到通過的CocoaPods你的項目,這裏有說明: https://github.com/AFNetworking/AFNetworking

一旦AFNetworking是安裝,使用下面的代碼:

NSString *apiName = URL; 

UIImage *yourImage; 
NSData *imgData = UIImageJPEGRepresentation(yourImage,1.0); 
imgData = [imgData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];]; 

NSData *otherFields = [self generateDataFromText:FORM DATA IN JSON]; 

NSDictionary * params = [[NSDictionary alloc] initWithObjectsAndKeys:imgData, @"imgFieldName",otherFields,@"add_product",nil]; 

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 



[manager POST:apiName parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 

    //posted successfully 


} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

    //failed 

}]; 

這是非常簡單的方法後,在Base64編碼的圖像。您可以根據需要將許多字段添加到params字典中。

+0

感謝您的回答。我按照你的建議做了同樣的事情,但只有圖像到達服務器而不是表單域。同樣的行爲也早。你可以建議一些教程上傳圖像和形式使用AFNetworking切斷。 – Gani414

+0

讓它與AFNetworking一起工作非常簡單。通過Cocoapods將AFNetworking添加到您的項目中,以下是說明: – Ahmed

+0

我在您的評論中沒有看到任何說明。無論如何,你的代碼中的關鍵是什麼? – Gani414