Как опубликовать данные текста и изображения в NSMutableUrlRequest?

Я должен опубликовать идентификатор сеанса, который генерируется во время проверки учетных данных и данных изображения. Но изображение и идентификатор сеанса не загружаются. Он работал нормально, когда я использовал ASIHTTPRequest, позже, когда я пытался использовать NSMutableUrlRequest и NSURLConnection, он, похоже, не работает.

Ниже приведен код, используемый для POST-изображения и идентификатора сеанса.

- (void)postinDataToServer:(NSData *)inData
{
//inData is the image data.
[inData retain];  
NSString *urlString = @"http://xyz.com/abcd/kgh.php";
NSURL* url = [NSURL URLWithString:urlString];

NSMutableData *photoData = [[NSMutableData alloc]init];

//SessionID is stored in NSUserDefaults
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSString * boundary = @"photoBoundaryParm";
NSString * boundaryString = [NSString stringWithFormat:@"--%@\r\n", boundary];
NSString * boundaryStringFinal = [NSString stringWithFormat:@"--%@--\r\n", boundary];

[photoData appendData:[boundaryString dataUsingEncoding:NSUTF8StringEncoding]];
[photoData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"SessionID\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[photoData appendData:[[NSString stringWithFormat:@"SessionID=%@",[defaults objectForKey:@"SessionID"]] dataUsingEncoding:NSUTF8StringEncoding]];
[photoData appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

[photoData appendData:[boundaryString dataUsingEncoding:NSUTF8StringEncoding]];
[photoData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"photo\";\r\nfilename=\"myphoto.png\"\r\nContent-Type: image/png\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[photoData appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[photoData appendData:inData];
[photoData appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

[photoData appendData:[boundaryStringFinal dataUsingEncoding:NSUTF8StringEncoding]];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:photoData];

NSString* requestDataLengthString = [[NSString alloc] initWithFormat:@"%d", [photoData length]];

[request addValue:requestDataLengthString forHTTPHeaderField:@"Content-Length"];
[request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"];

NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self
                        startImmediately:NO];

[connection scheduleInRunLoop:[NSRunLoop mainRunLoop]
                      forMode:NSDefaultRunLoopMode];
[connection start];

[inData release];
inData = nil;
}

Пожалуйста помоги.

Я застрял с этим в течение очень долгого времени.

Заранее спасибо.


person user1899840    schedule 01.10.2013    source источник
comment
В ваших методах делегирования соединения вы нажимаете обратный вызов успеха? (Если это ошибка, пожалуйста, предоставьте реальную ошибку, хотя, судя по звуку, она достигает успеха, просто не публикуя изображение - просто хочу сначала устранить очевидные проблемы!)   -  person David Doyle    schedule 01.10.2013
comment
Вам действительно нужно делать это вручную? Рассматривали ли вы возможность попробовать AFNetworking (см. stackoverflow.com /вопросы/15410689/)   -  person Vadim Yelagin    schedule 01.10.2013
comment
Вызываются методы delgate didReceiveResponse, didReceiveData и connectionDidFinishLoading. Но didFailWithError не вызывается. @ДэвидДойл   -  person user1899840    schedule 03.10.2013
comment
Я пытаюсь создать фреймворк, поэтому хотел максимально избегать третьих лиц. Сначала я использовал ASIHTTPRequest, и он работал нормально. Но у меня были другие проблемы во время интеграции моего фреймворка с другими приложениями, поэтому я переключился на вышеупомянутый метод. @ВадимЕлагин   -  person user1899840    schedule 03.10.2013
comment
Вы проверили это? nthn.me/posts/2012/objc-multipart-forms.html У меня работало.   -  person kubilay    schedule 19.02.2014


Ответы (2)


попробуйте этот код и передайте свои значения в сообщении nsstring

NSString* url=[NSString stringWithFormat:url];

NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:[NSURLURLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]
                                                        cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                    timeoutInterval:60.0];
//do post request for parameter passing
[theRequest setHTTPMethod:@"POST"];

NSString *post = [NSString stringWithFormat:@"&imageData=%@",postData];



NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]];


[theRequest setValue:postLength forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPBody:postData];

[theRequest  setURL:[NSURL URLWithString:url]];

[theRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"];

NSURLConnection  *serverConnectionObj = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
person YogiBhoi    schedule 01.10.2013

это решение метода класса:

заголовок

//=========================
// POST FORM WITH IMG
//=========================
+ (NSData *)postToUrl:(NSURL*)url
                 form:(NSDictionary*)form
             andImage:(UIImage*)img
             imageKey:(NSString*)imageKey
                error:(NSError**)error
    returningResponse:(NSURLResponse**)response;

Метод класса:

#pragma mark -
#pragma mark POST FORM
//=========================
// POST FORM
//=========================
+(NSData *)postToUrl:(NSURL*)url form:(NSDictionary*)form andImage:(UIImage*)img imageKey:(NSString*)imageKey error:(NSError**)error returningResponse:(NSURLResponse**)response{
    NSLog(@"postToUrl:%@ Form:%@ andImage:%@ imageKey:%@",url,form,img,imageKey);
    NSString *boundary = @"iOS_iKANIMO_BOUNDARY_STRING";
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request addValue:contentType forHTTPHeaderField:@"Content-Type"];

    NSMutableData *body = [NSMutableData data];

    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"photo.png\"\r\n", imageKey] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:UIImagePNGRepresentation(img)]];



    for (NSString*key in [form allKeys]) {
        NSLog(@"%@ - %@",key,[form objectForKey:key]);
        NSString *value = [form objectForKey:key];
        [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n%@",key, value] dataUsingEncoding:NSUTF8StringEncoding]];
    }


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

    //Now all we need to do is make a connection to the server and send the request:
    [request setHTTPBody:body];
    return [NSURLConnection sendSynchronousRequest:request returningResponse:response error:error];
}
person ikanimo    schedule 29.06.2014