【问题标题】:Upload image on webserver through JSON in ios using PHP使用 PHP 在 ios 中通过 JSON 上传网络服务器上的图像
【发布时间】:2014-12-04 08:02:07
【问题描述】:

我有一个应用程序,我在网络服务器上上传用户数据。

我正在使用下面的代码通过下面的代码将数据传递给网络服务器。

-(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);
    }
}

我可以在没有图像的情况下成功地将数据发送到网络服务器。

但是如果使用上面显示的代码通过Base64编码上传图像,则数据不会上传到网络服务器。 在 NSLog 中显示请求查询字符串太长。

我已经导入了 Base64.h 和 .m 文件。

我也想通过图像传递数据。

我该怎么做?

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

请帮帮我。

提前致谢。

【问题讨论】:

    标签: php ios objective-c image webserver


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢哥们。我会检查并告诉你。
    • 我仍然收到请求字符串太长的错误消息,因为我在 NSLog 中得到了太长的 base64String。
    • 你知道如何通过多路径数据发送图像吗?如果是,请帮忙。免费 hoy 帮助 kar ne bhai。
    【解决方案2】:

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

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

    编辑

    另外,如果您可以访问 php.ini,您可以在 post_max_size 行中更改它

    【讨论】:

    • @o Pi:所以我的代码是正确的,但是在 Web 服务器端,我需要对其进行更改。好吗?
    • 我的意思是在上面的代码中我不需要改变任何东西,只需要在服务器端代码。
    • 是的,没错。您可以选择在 .htaccess 文件或 php.ini 中执行此操作
    • @o Pi:是的,我们正在努力。一旦它得到修复,我一定会让你知道这件事。
    【解决方案3】:

    这样试试;

    - (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
            }
        }];
    }
    

    【讨论】:

      【解决方案4】:

      我使用以下代码和多部分表单数据完成了它。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-05
        • 2012-04-23
        • 2017-12-31
        • 1970-01-01
        • 2012-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多