2013-12-10 9 views
5

Ho provato "Carica un'attività di caricamento" AFNetworking e this per caricare l'immagine nel server .net, ma non è stato possibile. Questo è quello che ho provato.Carica l'immagine sul servizio web in ios

- (void)uploadJPEGImage:(NSString*)requestURL image:(UIImage*)image 
{ 
    NSURL *url = [[NSURL alloc] initWithString:requestURL]; 
    NSMutableURLRequest *urequest = [NSMutableURLRequest requestWithURL:url]; 

    [urequest setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 
    [urequest setHTTPShouldHandleCookies:NO]; 
    [urequest setTimeoutInterval:60]; 
    [urequest setHTTPMethod:@"POST"]; 

    NSString *boundary = @"---------------------------14737809831466499882746641449"; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
    [urequest setValue:contentType forHTTPHeaderField: @"Content-Type"]; 

    NSMutableData *body = [NSMutableData data]; 
    // add image data 
    NSData *imageData = UIImageJPEGRepresentation(qrCodeImage.image, 1.0); 
    if (imageData) { 
     [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
     //[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", pictureName] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:imageData]; 
     [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    } 

    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [urequest setHTTPBody:body]; 
    NSLog(@"Check response if image was uploaded after this log"); 
    //return and test 
    NSData *returnData = [NSURLConnection sendSynchronousRequest:urequest returningResponse:nil error:nil]; 
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

    NSLog(@"%@", returnString); 

} 

Dal AFNetworking codice dà, mi errore di tempo this run, nonostante l'aggiunta di

self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml", @"text/html", nil]; 

Grazie.

+0

C'è una riga commentata nel codice che aggiunge una riga 'Content-Disposition' ai dati. Ne hai bisogno durante l'esecuzione di un post multipart, quindi commentalo. – neilco

+0

L'ho commentato perché ho generato il codice QR nell'applicazione stessa e quindi l'immagine non avrà alcun percorso. –

+0

Devi avere quella linea nel tuo payload multipart. È fondamentale Il valore 'name' in quella linea è il nome del parametro, non un percorso di file, ad es. 'immagine' o' foto'. – neilco

risposta

2

Nel tuo codice mancava il contenuto __VIEWSTATE par. Ho aggiunto il codice per estrarre l'URL dell'immagine caricata alla fine:

- (void)uploadJPEGImage:(NSString*)requestURL image:(UIImage*)image 
{ 
    NSURL *url = [[NSURL alloc] initWithString:requestURL]; 
    NSMutableURLRequest *urequest = [NSMutableURLRequest requestWithURL:url]; 

    [urequest setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 
    [urequest setHTTPShouldHandleCookies:NO]; 
    [urequest setTimeoutInterval:60]; 
    [urequest setHTTPMethod:@"POST"]; 

    NSString *boundary = @"---------------------------14737809831466499882746641449"; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
    [urequest setValue:contentType forHTTPHeaderField: @"Content-Type"]; 

    NSMutableData *body = [NSMutableData data]; 

    // Add __VIEWSTATE 
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Disposition: form-data; name=\"__VIEWSTATE\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"/wEPDwUKLTQwMjY2MDA0M2RkXtxyHItfb0ALigfUBOEHb/mYssynfUoTDJNZt/K8pDs=" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 

    // add image data 
    NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 
    if (imageData) { 
     [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[@"Content-Disposition: form-data; name=\"FileUpload1\"; filename=\"image.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:imageData]; 
     [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    } 

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

    [urequest setHTTPBody:body]; 
    NSLog(@"Check response if image was uploaded after this log"); 
    //return and test 
    NSHTTPURLResponse *response = nil; 
    NSData *returnData = [NSURLConnection sendSynchronousRequest:urequest returningResponse:&response error:nil]; 
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

    NSLog(@"%@", returnString); 

    // Extract the imageurl 
    NSArray *parts = [returnString componentsSeparatedByString:@"\r\n"]; 
    if (parts.count > 0) { 
     NSError *error = NULL; 
     NSDictionary *result = [NSJSONSerialization JSONObjectWithData:[parts[0] dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error]; 
     NSLog(@"%@", result[@"imageurl"]); // Will either be nil or a URL string 
    } 
} 
1

1.I pensare si perde l'input nascosto nella pagina di upload:

upload page html code

2.Using il codice qui sotto, posso caricare con successo e ottenere la stringa risposta giusta:

xcode log

UIImage *image = [UIImage imageNamed:@"a.jpg"]; 
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.responseSerializer = [AFHTTPResponseSerializer new]; 

// add hidden parameter here 
NSDictionary * parameters = @{@"__VIEWSTATE":@"/wEPDwUKLTQwMjY2MDA0M2RkXtxyHItfb0ALigfUBOEHb/mYssynfUoTDJNZt/K8pDs="}; 

[manager POST:@"http://cnapi.iconnectgroup.com/upload/fileuploadnew.aspx" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    // add image date here 
    [formData appendPartWithFileData:UIImageJPEGRepresentation(image, 0.5) name:@"FileUpload1" fileName:@"avatar.jpg" mimeType:@"image/jpeg"]; 

} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSData * data = (NSData *)responseObject; 
    NSLog(@"Success,Response string: %@", [NSString stringWithCString:[data bytes] encoding:NSISOLatin1StringEncoding]); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}];