【问题标题】:How to post image on server with dictionary iOS?如何使用字典 iOS 在服务器上发布图像?
【发布时间】:2016-04-20 13:15:19
【问题描述】:

我有一些键/值的dictionary (dict) 和一个image。现在我想用字典将图像上传到服务器。我已经尝试过了,但没有取得任何成功。这是我的示例代码--

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

[request setURL:[NSURL URLWithString:urlString]];

[request setHTTPMethod:@"POST"];

NSMutableData *body = [NSMutableData data];

NSString *boundary = @"---------------------------14737809831466499882746641449";

NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];

[request addValue:contentType forHTTPHeaderField: @"Content-Type"];

NSData *imageData = UIImageJPEGRepresentation(image,0.5);//or you can use png representation- UIImagePNGRepresentation(image);

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

[body appendData:[@"Content-Disposition: form-data; name=\"thumbnail\"; filename=\"image.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[@"Content-Type: image/png\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:imageData];

[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

//  parameter all_data
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"all_data\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"%@",dict] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

// close form
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// setting the body of the post to the request
[request setHTTPBody:body];

NSError *error=nil;
NSHTTPURLResponse *response=nil;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

我需要帮助我哪里出错了..提前谢谢

【问题讨论】:

    标签: ios objective-c uiimage http-post nsdictionary


    【解决方案1】:

    试试下面的代码:

        -(void)uploadImage:(NSString *)api :(NSDictionary *)params : (UIImage *)image {
    
        NSURL *myURL = [NSURL URLWithString:api];
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myURL];
        [request setHTTPMethod:@"POST"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
        NSString *boundary = @"---------------------------14737809831466499882746641449";
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@; charset=UTF-8", boundary];
        [request addValue:contentType forHTTPHeaderField:@"Content-Type"];
        NSMutableData *theBodyData = [NSMutableData data];
        for (int i=0; i<[[params allKeys] count]; i++)
        {
            [theBodyData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
            NSString *value=@"";
            value=[params objectForKey:[[params allKeys] objectAtIndex:i]];
            NSString * value1=[NSString stringWithFormat:@"Content-Disposition: form-data; name=%@\r\n\r\n%@\r\n",[[params allKeys] objectAtIndex:i],value];
            [theBodyData appendData:[value1 dataUsingEncoding:NSUTF8StringEncoding]];
        }
    
        [theBodyData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
        [theBodyData appendData:[@"Content-Disposition: form-data; name=\"my_file1\"; filename=\"image1.jpeg\"\r\n" dataUsingEncoding:NSASCIIStringEncoding]];
    
        [theBodyData appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSASCIIStringEncoding]];
        NSData *myData = UIImageJPEGRepresentation(image,0.5);
        [theBodyData appendData:[NSData dataWithData:myData]];
    
        [theBodyData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    
    
        [request setHTTPBody:theBodyData];
        [request setValue:contentType forHTTPHeaderField: @"Content-Type"];
        [request setValue:[NSString stringWithFormat:@"%d", (int)[theBodyData length]] forHTTPHeaderField:@"Content-Length"];
        [request setHTTPBody: theBodyData];
    
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
    
        NSURLSessionDataTask * dataTask =[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            if(error == nil) {
                NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                NSLog(@"Server Raw Response : %@",responseString);
            }
    
        }];
    
        [dataTask resume];
    
    
    }
    

    【讨论】:

      【解决方案2】:

      您的代码看起来不错,但我认为您必须将您的字典转换为json string。只需替换此行-

      [body appendData:[[NSString stringWithFormat:@"%@",dict] dataUsingEncoding:NSUTF8StringEncoding]];
      

      NSString *jsonStr = [[NSString alloc]initWithData:[NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil] encoding:NSUTF8StringEncoding];
      
      [body appendData:[jsonStr dataUsingEncoding:NSUTF8StringEncoding]];
      

      也许这会对你有所帮助。

      【讨论】:

      • 很高兴为您提供帮助:) 如果答案有帮助,请将其标记为已接受。所以其他用户会发现它很有帮助。谢谢
      猜你喜欢
      • 2015-12-03
      • 2012-08-15
      • 1970-01-01
      • 2012-12-06
      • 2011-03-14
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多