使用PHP在ios中通过JSON将图像上传到Web服务器上


Upload image on webserver through JSON in ios using PHP

我有一个应用程序,在其中我将用户的数据上传到Web服务器上。

我使用下面的代码将数据传递到Web服务器,代码如下。

-(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文件。

我还想传递带有图像的数据。

我该怎么做?

我知道有很多链接,但我想通过这种方式,所以请告诉我我在这里做错了什么?

请帮帮我。

提前谢谢。

Hey Manthan尝试以下代码将UIImage转换为NSString,然后将其传递给服务器

        UIImage *imgPic =[UIImage imageNamed:@"register_btn.png"];
        NSData * imageData =  UIImagePNGRepresentation(imgPic);
        NSString *base64String = [imageData base64EncodedStringWithOptions:0];

这是一个服务器问题,它告诉您这个错误。

json没有最大长度,但可以发送最大数量的数据。要修复此问题,只需设置.htaccess文件中可以发送的数据量:php_value post_max_size 20M

编辑

此外,如果您有权访问php.ini,您可以在post_max_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
        }
    }];
}

我使用以下带有多部分表单数据的代码完成了这项工作。

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"];

    }
}