通过POST方法发送带图像的参数?

时间:2013-11-21 12:17:07

标签: ios iphone objective-c cocoa-touch

我想用参数(用户名,密码..等)发送我的图像?以下是我的代码:

-(void) senRequestForPostAnswerWithImage:(NSString *)imageName andAnswer:(NSString *)answer andQuestionID:(NSString *)questionID
{
    NSUserDefaults *loginData = [NSUserDefaults standardUserDefaults];
    NSString *username = [loginData objectForKey:@"username"] ;
    NSString *password = [loginData objectForKey:@"password"];

    NSString *postString = [NSString stringWithFormat:@"&username=%@&password=%@&image=%@&answer=%@&question_id=%@", username, password, imageName, answer, questionID];
    NSString *urlString = @"http://myAPIName/MethodName";
    NSURL *myURL = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    NSMutableURLRequest *detailRequestToServer =[NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
    [detailRequestToServer setHTTPMethod:@"POST"];
    [detailRequestToServer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    const char *utfString = [postString UTF8String];
    NSString *utfStringLenString = [NSString stringWithFormat:@"%zu", strlen(utfString)];
    [detailRequestToServer setHTTPBody:[NSData dataWithBytes: utfString length:strlen(utfString)]];
    [detailRequestToServer setValue:utfStringLenString forHTTPHeaderField:@"Content-Length"];

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:detailRequestToServer delegate:self];
    if (theConnection)
    {
        self.responseData = [[NSMutableData alloc] init];
        [GeneralClass startHUDWithLabel:@"Loading…"];
    }
    else
        NSLog(@"Connection Failed!");
}

我知道这个网站上有很多问题,但我不知道在现有代码中需要更改的位置和内容?

那么,请建议我在现有代码中需要更改发送图像的添加功能吗?

  

注意:没有图片,上面的代码对我来说效果很好。

6 个答案:

答案 0 :(得分:2)

我的建议是使用AFNetworking。它将大大简化您的过程,为您节省大量时间。它是开发人员广泛使用的框架。

https://github.com/AFNetworking/AFNetworking

您可以使用几行(POST-multipart request)轻松发送带参数的图像:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileURL:filePath name:@"image" error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

答案 1 :(得分:1)

据我所知,你不能直接发送它作为UIImage。您需要将其转换为NSData,在服务器端解码。

另一种选择是将图像上传到某处,可以通过URL访问。 (但这通常在服务器端完成,并且URL作为响应返回)。

There's a post here关于将UIImage转换为NSData。

答案 2 :(得分:1)

使用此功能,您可以传递参数以及图像数据。

NSString *urlString = [NSString stringWithFormat:@"http://myAPIName/MethodName/test.php&username=%@&password=%@&image=%@&answer=%@&question_id=%@", username, password, imageName, answer, questionID];
NSLog(@"MyURL: %@",urlString);

urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:urlString]];

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

NSString *str=[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"SourceImage\"; filename=\"Image_%@\"\r\n",[imagePath lastPathComponent]];
[body appendData:[[NSString stringWithString:str] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithContentsOfFile:imagePath]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[request setHTTPBody:body];

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

答案 3 :(得分:0)

如果您想通过post方法发送带图像的参数,请使用以下代码。它对我来说非常好..

我尝试按照您的要求更改我的代码,然后按照它进行操作 您需要创建NSMutableDictionary并在其上添加参数,并将此词典作为JSON格式附加到NSMutableData(您需要将 NSMutableData 库添加到您的项目中)

-(void) senRequestForPostAnswerWithImage:(NSString *)imageName andAnswer:(NSString *)answer andQuestionID:(NSString *)questionID
{
    NSUserDefaults *loginData = [NSUserDefaults standardUserDefaults];
    NSString *username = [loginData objectForKey:@"username"] ;
    NSString *password = [loginData objectForKey:@"password"];

     // create NSMutableDictionary for store parameter
    NSMutableDictionary *dicOfData = [[NSMutableDictionary alloc] init];
    [dicOfData setObject:username forKey:@"username"];
    [dicOfData setObject:password forKey:@"password"];
    [dicOfData setObject:imageName forKey:@"imageName"];
    [dicOfData setObject:answer forKey:@"answer"];
    [dicOfData setObject:questionID forKey:@"questionID"];

    NSString *url =  @"http://myAPIName/MethodName";
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
    [request setHTTPMethod:@"POST"];

    /// create NSMutableData to store data of dictionary
    NSMutableData *body = [NSMutableData data];    
    NSString *boundary = @"--iOS Boundary Line--";
    [request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField: @"Content-Type"];

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

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    NSString  *imgPath = [documentsDir stringByAppendingPathComponent:imageName];
    if([imageName length] > 0)
    {
        if([[NSFileManager defaultManager] fileExistsAtPath:imgPath])
        {
            [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

            [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"photo\"; filename=\"%@\"\r\n", imageName] dataUsingEncoding:NSUTF8StringEncoding]];
            [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
            [body appendData:[NSData dataWithContentsOfFile:imgPath]];
            [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        }
    }
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"requestData\"\r\n\r\n%@", [dicOfData JSONRepresentation] ] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    [request setHTTPBody:body];
    [request addValue:[NSString stringWithFormat:@"%d", [body length]] forHTTPHeaderField:@"Content-Length"];

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if (theConnection)
    {
        self.responseData = [[NSMutableData alloc] init];
    }
    else
        NSLog(@"Connection Failed!");
}

在您的服务器 (PHP) 一侧..您将获得图像(如果您添加了对象和名称)与字典格式中的其他参数。

答案 4 :(得分:-1)

参考此代码 - 它对我来说非常适合 -

NSString *userID = mainDelegate.loginUserPin;

UIImage *imag = self.addImage;

NSString *urlString = mainDelegate.I2K2_Webservice_Url;

NSData *imageData = UIImageJPEGRepresentation(imag, 90);

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
[request setTimeoutInterval:6*60000];

NSString *boundary = @"*****";
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]];

//Title
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name=\"title\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@~%@",userID,txtName.text] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

//Description
[body appendData:[@"Content-Disposition: form-data; name=\"description\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

NSString *imgNameString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"%@~%@\"\r\n",userID,txtName.text];

NSLog(@"imgNameString : %@",imgNameString);

[body appendData:[[NSString stringWithString:imgNameString] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"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];             

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

NSLog(@"%@",returnString);

答案 5 :(得分:-1)

您无法通过向Web服务器指定其名称来发送 UIImage 。您应该将其作为 NSData 包含在 HTTP正文中。我使用 ASIHTTPRequest ,这很简单而且完美。使用ASIHTTPRequest。示例代码如下所示

NSData *imgData = UIImageJPEGRepresentation(IMAGE_HERE, 0.9);
formReq = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:urlString]];
formReq.delegate = self;
[formReq setPostValue:VALUE1 forKey:KEY1];
[formReq setPostValue:VALUE2 forKey:KEY2];
if (imgData) {
    [formReq setData:imgData withFileName:@"SAMPLE.jpg" andContentType:@"image/jpeg" forKey:IMAGE_KEY];
}
[formReq startSynchronous];