使用PHP在ios中通过JSON在Web服务器上上载图像
我有一个应用程序,我上传用户的数据在Web服务器上 我使用下面的代码将数据通过下面的代码传递到webserver使用PHP在ios中通过JSON在Web服务器上上载图像,php,ios,objective-c,image,webserver,Php,Ios,Objective C,Image,Webserver,我有一个应用程序,我上传用户的数据在Web服务器上 我使用下面的代码将数据通过下面的代码传递到webserver -(IBAction)btnRegister:(id)sender { jsonSP = [SBJSON new]; jsonSP.humanReadable = YES; NSString *service = @"/register.php"; NSData *imageData = UIImagePNGRepresentation([UIIm
-(IBAction)btnRegister:(id)sender
{
jsonSP = [SBJSON new];
jsonSP.humanReadable = YES;
NSString *service = @"/register.php";
NSData *imageData = UIImagePNGRepresentation([UIImage imageNamed:@"register_btn.png"]);
[Base64 initialize];
NSString *imageString = [Base64 encode:imageData];
NSLog(@"%@",imageString);
NSString *requestString = [NSString stringWithFormat:@"{\"?username\"=\"%@\"&\"user_password\"=\"%@\"&\"first_name\"=\"%@\"&\"email\"=\"%@\"&\"profile_photo_link\"=\"%@\"\"}",@"Test",@"Test",@"Test",@"Test@mmm.com",imageString];
NSData *requestData = [NSData dataWithBytes: [requestString UTF8String] length: [requestString length]];
NSString *fileLoc = [[NSBundle mainBundle] pathForResource:@"URLName" ofType:@"plist"];
NSDictionary *fileContents = [[NSDictionary alloc] initWithContentsOfFile:fileLoc];
NSString *urlLoc = [fileContents objectForKey:@"URL"];
urlLoc = [urlLoc stringByAppendingString:service];
NSLog(@"URL : %@",urlLoc);
// urlLoc = [urlLoc stringByAppendingString:@"?username=abcd&password=abcd"];
urlLoc = [urlLoc stringByAppendingString:requestString];
urlLoc = [urlLoc stringByReplacingOccurrencesOfString:@"{" withString:@""];
urlLoc = [urlLoc stringByReplacingOccurrencesOfString:@"}" withString:@""];
urlLoc = [urlLoc stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSLog(@"URL : %@",urlLoc);
// [fileContents release]; //o_r
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: urlLoc]];
NSString *postLength = [NSString stringWithFormat:@"%d", [requestData length]];
[request setHTTPMethod: @"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody: requestData];
// self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
NSError *respError = nil;
NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: &respError ];
NSLog(@"response is %@",returnData);
// [request release];
if (respError)
{
//[customSpinner hide:YES];
UIAlertView *alt=[[UIAlertView alloc]initWithTitle:@"Internet connection is not Available!" message:@"Check your network connectivity" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alt show];
//[alt release];
}
else
{
NSString *responseString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding];
NSLog(@"response string %@",responseString);
}
}
我能够成功地将数据发送到Web服务器而不需要映像
但是,如果通过编码Base64上传带有上面所示代码的图像,则数据不会上传到Web服务器上它在NSLog中告诉我一个错误,请求查询字符串太长。
我已经导入了Base64.h和.m文件
我还想用图像传递数据
我该怎么做
我知道有很多链接,但我想通过这种方式传递,所以请告诉我我在这里做错了什么
请帮帮我
提前感谢。嘿,Manthan尝试下面的代码将
UIImage
转换为NSString
,然后将其传递给服务器
UIImage *imgPic =[UIImage imageNamed:@"register_btn.png"];
NSData * imageData = UIImagePNGRepresentation(imgPic);
NSString *base64String = [imageData base64EncodedStringWithOptions:0];
这是一个服务器问题,它会告诉你这个错误 json没有最大长度,但可以发送的数据量是最大的。要解决这个问题,只需在.htaccess文件中设置可以发送的数据量:
php\u value post\u max\u size 20M
编辑
此外,如果您有权访问php.ini,您可以在post\u max\u size
行中更改它
- (void)addNewItem:(SH_NewItem *)newItem withCompletitionBlock:(void(^)(NSArray *items, NSError *error, NSDictionary *userInfo))completitionBlock
{
AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:[[SH_Shared sharedInstance] getBaseURL]]];
//main cover image...
NSData *imageData = UIImageJPEGRepresentation(newItem.image, JPEG_IMAGE_QUALITY);
NSData *imageData1 = UIImageJPEGRepresentation(newItem.image1, JPEG_IMAGE_QUALITY);
NSData *imageData2 = UIImageJPEGRepresentation(newItem.image2, JPEG_IMAGE_QUALITY);
NSData *imageData3 = UIImageJPEGRepresentation(newItem.image3, JPEG_IMAGE_QUALITY);
NSData *imageData4 = UIImageJPEGRepresentation(newItem.image4, JPEG_IMAGE_QUALITY);
NSDictionary *params = [[NSDictionary alloc]init];
params = [NSDictionary dictionaryWithObjectsAndKeys:
newItem.title, @"title",
newItem.itemDescription, @"description",
[[SH_Shared sharedInstance] token], @"token",
nil];
NSLog(@"params-%@",params);
NSMutableURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:@"new_item" parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData> formData) {
if (imageData != nil)
[formData appendPartWithFileData:imageData name:@"images[0]" fileName:@"image_ad.png" mimeType:@"multipart/form-data"];
if (imageData1 != nil)
[formData appendPartWithFileData:imageData1 name:@"images[1]" fileName:@"image_ad1.png" mimeType:@"multipart/form-data"];
if (imageData2 != nil)
[formData appendPartWithFileData:imageData2 name:@"images[2]" fileName:@"image_ad2.png" mimeType:@"multipart/form-data"];
if (imageData3 != nil)
[formData appendPartWithFileData:imageData3 name:@"images[3]" fileName:@"image_ad3.png" mimeType:@"multipart/form-data"];
if (imageData4 != nil)
[formData appendPartWithFileData:imageData4 name:@"images[4]" fileName:@"image_ad4.png" mimeType:@"multipart/form-data"];
}];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[self getDataWithOperation:op completitionBlock:^(NSData *data, NSError *error, NSDictionary *userInfo) {
CJSONDeserializer *deserializer = [CJSONDeserializer deserializer];
NSError *deserializeError = nil;
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"Response: %@", str);
NSDictionary *requestResponseDict = [deserializer deserialize:data error:&deserializeError];
NSString *status = [requestResponseDict valueForKey:kStatus];
BOOL isSuccess = [[status valueForKey:kSuccess] boolValue];
if (isSuccess)
{
// it's OK
}
else
{
// its error
}
}];
}
-(void)addNewItem:(SH_NewItem*)带有completionblock的NewItem:(void(^)(NSArray*items,NSError*error,NSDictionary*userInfo))completionblock
{
AFHTTPClient*client=[AFHTTPClient clientWithBaseURL:[NSURL URLWithString:[[SH_Shared sharedInstance]getBaseURL]];
//主封面图片。。。
NSData*imageData=UIIMAGEJPEG表示法(newItem.image,JPEG图像质量);
NSData*imageData1=UIIMAGEJPEGREPORATION(newItem.image1,JPEG图像质量);
NSData*imageData2=UIIMAGEJPEGREPORATION(newItem.image2,JPEG图像质量);
NSData*imageData3=UIIMAGEJPEGREPORATION(newItem.image3,JPEG图像质量);
NSData*imageData4=UIIMAGEJPEGREPORATION(newItem.image4,JPEG图像质量);
NSDictionary*params=[[NSDictionary alloc]init];
params=[NSDictionary Dictionary WithObjectsAndKeys:
newItem.title,@“title”,
newItem.itemsdescription,@“description”,
[[SH_sharedInstance]令牌],@“令牌”,
零];
NSLog(@“参数-%@”,参数);
NSMutableURLRequest*request=[客户端multipartFormRequestWithMethod:@“POST”路径:@“new_item”参数:params constructingBodyWithBlock:^(id formData){
如果(imageData!=nil)
[formData appendPartWithFileData:imageData名称:@“images[0]”文件名:@“image_ad.png”mimeType:@“multipart/form data”];
如果(imageData1!=nil)
[formData appendPartWithFileData:imageData1名称:@“images[1]”文件名:@“image_ad1.png”mimeType:@“multipart/form data”];
如果(imageData2!=nil)
[formData appendPartWithFileData:imageData2名称:@“images[2]”文件名:@“image_ad2.png”mimeType:@“multipart/form data”];
如果(imageData3!=nil)
[formData appendPartWithFileData:imageData3名称:@“images[3]”文件名:@“image_ad3.png”mimeType:@“multipart/form data”];
如果(imageData4!=nil)
[formData appendPartWithFileData:imageData4名称:@“images[4]”文件名:@“image_ad4.png”mimeType:@“multipart/form data”];
}];
AFHTTPRequestOperation*op=[[AFHTTPRequestOperation alloc]initWithRequest:request];
[self-getDataWithOperation:op CompletionBlock:^(NSData*数据,NSError*错误,NSDictionary*用户信息){
CJSONDeserializer*反序列化器=[CJSONDeserializer反序列化器];
n错误*反序列化错误=nil;
NSString*str=[[NSString alloc]initWithData:数据编码:NSUTF8StringEncoding];
NSLog(@“响应:%@”,str);
NSDictionary*requestResponseDict=[反序列化程序反序列化:数据错误:&反序列化错误];
NSString*状态=[requestResponseDict valueForKey:kStatus];
BOOL issucess=[[status valueForKey:ksucces]boolValue];
如果(isSuccess)
{
//没关系
}
其他的
{
//它的错误
}
}];
}
我使用以下代码和多部分表单数据完成了这项工作
responseData = [NSMutableData data];
NSString *service = @"http:///registerUser.php";
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:service]];
[request setHTTPMethod:@"POST"];
//创建边界
NSString *boundary = @"---------------------------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:[@"Content-Disposition: form-data; name=\"profile_photo_link\"; filename=\"ipodfile.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
UIImageView *imgvUserImage = [[UIImageView alloc]init];
imgvUserImage.image= [UIImage imageNamed:@"register_btn.png"];
NSData * imageData=[NSData dataWithData:UIImagePNGRepresentation(imgvUserImage.image)];
[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"username\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@",txtUserName.text] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
//将立柱主体设置为要求
[request setHTTPBody:body];
postconnection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
**回应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[responseData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[responseData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
[self removeProgressIndicator];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if (connection == postconnection)
{
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSLog(@"%@",responseString);
// NSDictionary *deserializedData = [responseString objectFromJSONString];
// NSString *string = [deserializedData objectForKey:@"Status"];
}
}
谢谢你,伙计。我会检查并让你知道。我仍然收到错误消息,请求字符串太长,因为我在NSLog中得到太长的base64String。你知道如何通过多路径数据发送图像吗?如果是,请帮忙。释放hoy来帮助kar ne bhai。@o Pi:所以我的代码是正确的,但在web服务器端,我需要对其进行更改。好吗?我的意思是,在上面的代码中,我不需要更改任何东西,只需要更改服务器端代码。是的,没错。您可以选择在.htaccess文件或php中执行此操作。ini@oPi:是的,我们正在努力。一旦修好了,我一定会让你知道的。