2013-12-10 24 views
5

Próbowałem wykonać zadanie "Utwórz zadanie przesyłania" i this, aby przesłać obraz na serwer .net, ale nie udało się. Oto, co próbowałem.Prześlij obraz do serwisu WWW w 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); 

} 

Ponieważ kod AFNetworking daje, mi błąd czasu this bieg pomimo dodawania

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

Dzięki.

+0

W kodzie znajduje się wiersz, który dodaje wiersz "Content-Disposition" do danych. Potrzebujesz tego podczas wykonywania postu wieloczęściowego, więc odkomentuj go. – neilco

+0

Skomentowałem to, ponieważ wygenerowałem kod QR w samej aplikacji i dlatego obraz nie będzie miał żadnej ścieżki. –

+0

Musisz mieć tę linię w wieloczęściowej ładowności. To krytyczne. Wartość 'name' w tym wierszu to nazwa parametru, a nie ścieżka do pliku, np. 'image' lub' zdjęcie'. – neilco

Odpowiedz

2

W Twoim kodzie brak było paragrafu treści __VIEWSTATE. Dodałem kod, aby wyodrębnić adres URL przesłanego obrazu na końcu:

- (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 myśleć pominięcia ukryte wejście na stronie Dodano:

upload page html code

2.Using poniższy kod, mogę przesłać powodzeniem i uzyskać odpowiedni ciąg reakcji:

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); 
}]; 
Powiązane problemy