获取上传旋转的图像表单服务器时的上传

问题描述:

- (IBAction)grabImage{ 
    UIImagePickerController *ipc = [[UIImagePickerController alloc] init]; 
    ipc.delegate = self; 
    ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    [self presentModalViewController:ipc animated:YES]; 
    [ipc release]; 

} 

-(void)imageuploaded 
{ 

    /* 
    turning the image into a NSData object 
s getting the image back out of the UIImageView 
    setting the quality to 90 
    */ 
    //MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
    //hud.labelText = @"Uploading image "; 

    //assume that the image is loaded in landscape mode from disk 




    NSData *imageData = UIImageJPEGRepresentation(image.image, 0.09); 

    // setting up the URL to post to 
    NSString *urlString = NSLocalizedString(UploadText, @""); 

    // setting up the request object now 
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
    [request setURL:[NSURL URLWithString:urlString]]; 
    [request setHTTPMethod:@"POST"]; 

    /* 
    add some header info now 
    we always need a boundary when we post a file 
    also we need to set the content type 

    You might want to generate a random boundary.. this is just the same 
    as my output from wireshark on a valid html post 
    */ 
    NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"]; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 


    // Create a image file name 

    store *myStore =[store sharedstore]; 
    NSString *imagename=myStore.Emailaddress; 

    /* 
    now lets create the body of the post 
    */ 
    NSMutableData *body = [NSMutableData data]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@.png\"\r\n",imagename] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithString:@"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]]; 
    // setting the body of the post to the reqeust 
    [request setHTTPBody:body]; 

    // now lets make the connection to the web 
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@",returnString); 

    //[MBProgressHUD hideHUDForView:self.view animated:YES]; 


    label.hidden=YES; 

} 
+0

使主同步请求线?你确定吗? – folex

+0

此外,这是一个问题或某种“如何做”? – folex

使用此代码https://gist.github.com/1064652在上载到服务器之前修复图像方向。

UPD: 点击创建新文件,选择Cocoa Touch,然后选择Objective-C类别。然后在“Category”字段中输入FixOrientation,在“Category on”字段中输入UIImage。然后点击下一步并完成文件创建。 之后,插入方法声明

- (UIImage *)fixOrientation; 

中的UIImage + FixOrientation.h

,并从GitHub复制实施的UIImage + FixOrientation.m文件。

接下来,添加

#import "UIImage+FixOrientation.h" 

到类,是你与图像工作。

之后,替换字符串

NSData *imageData = UIImageJPEGRepresentation(image.image, 0.09); 

串:

NSData *imageData = UIImageJPEGRepresentation([image.image fixOrientation], 0.09); 
+0

它创建了很多像imageOrientaion和大小的警告,你可以请帮助我在这些东西的初始化 –

+0

感谢百万..它的作品像一个魅力.. –

从上面的类只使用这个方法的改进:

- (UIImage *) fixOrientation: (UIImage*) image { 

    // No-op if the orientation is already correct 
    if (image.imageOrientation == UIImageOrientationUp) 
     return image; 

    // We need to calculate the proper transformation to make the image upright. 
    // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. 
    CGAffineTransform transform = CGAffineTransformIdentity; 

    switch (image.imageOrientation) { 
     case UIImageOrientationDown: 
     case UIImageOrientationDownMirrored: 
      transform = CGAffineTransformTranslate(transform, image.size.width, image.size.height); 
      transform = CGAffineTransformRotate(transform, M_PI); 
      break; 

     case UIImageOrientationLeft: 
     case UIImageOrientationLeftMirrored: 
      transform = CGAffineTransformTranslate(transform, image.size.width, 0); 
      transform = CGAffineTransformRotate(transform, M_PI_2); 
      break; 

     case UIImageOrientationRight: 
     case UIImageOrientationRightMirrored: 
      transform = CGAffineTransformTranslate(transform, 0, image.size.height); 
      transform = CGAffineTransformRotate(transform, -M_PI_2); 
      break; 
    } 

    switch (image.imageOrientation) { 
     case UIImageOrientationUpMirrored: 
     case UIImageOrientationDownMirrored: 
      transform = CGAffineTransformTranslate(transform, image.size.width, 0); 
      transform = CGAffineTransformScale(transform, -1, 1); 
      break; 

     case UIImageOrientationLeftMirrored: 
     case UIImageOrientationRightMirrored: 
      transform = CGAffineTransformTranslate(transform, image.size.height, 0); 
      transform = CGAffineTransformScale(transform, -1, 1); 
      break; 
    } 

    // Now we draw the underlying CGImage into a new context, applying the transform 
    // calculated above. 
    CGContextRef ctx = CGBitmapContextCreate(NULL, image.size.width, image.size.height, 
              CGImageGetBitsPerComponent(image.CGImage), 0, 
              CGImageGetColorSpace(image.CGImage), 
              CGImageGetBitmapInfo(image.CGImage)); 
    CGContextConcatCTM(ctx, transform); 
    switch (image.imageOrientation) { 
     case UIImageOrientationLeft: 
     case UIImageOrientationLeftMirrored: 
     case UIImageOrientationRight: 
     case UIImageOrientationRightMirrored: 
      // Grr... 
      CGContextDrawImage(ctx, CGRectMake(0,0,image.size.height,image.size.width), image.CGImage); 
      break; 

     default: 
      CGContextDrawImage(ctx, CGRectMake(0,0,image.size.width,image.size.height), image.CGImage); 
      break; 
    } 

    // And now we just create a new UIImage from the drawing context 
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx); 
    UIImage *img = [UIImage imageWithCGImage:cgimg]; 
    CGContextRelease(ctx); 
    CGImageRelease(cgimg); 
    return img; 
}