2013-12-10 56 views
5

我试过AFNetworking的“创建上传任务”和this在.net服务器上传图像,但不能。这是我试过的。将图像上传到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); 

} 

由于AFNetworking代码给出了,我this运行时错误尽管增强了

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

感谢。

+0

在代码中添加了一行注释,它向数据添加了“Content-Disposition”行。执行多部分帖子时需要这个,所以取消注释。 – neilco

+0

我评论说,因为我已经在应用程序本身生成了QR码,因此图像不会有任何路径。 –

+0

您需要在多部分有效负载中具有该行。这很关键。该行中的'name'值是参数名称,而不是文件路径,例如'图片'或'照片'。 – neilco

回答

2

您的代码缺少__VIEWSTATE内容参数。我在代码中添加了在最后提取上传图片的网址:

- (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想你好想在上传页面中隐藏输入:

upload page html code

2.使用下面的代码,我可以成功上传并得到正确的响应字符串:

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); 
}]; 
相关问题