2012-02-26 32 views
2

我在尝试创建一个小菜单项应用来学习Cocoa/OS X编程。从NSPasteBoard的NSImage到base64对于HTTP POST不如预期的那样工作

基本上,它是坐在你的码头,你拖动一个图像文件,它会上传文件imgur并告诉你它上传的URL。

它“工作”在imgur的API不会给我带来任何错误,但图像无法正确渲染。

适用代码:

ScreenshotController.m

- (void)uploadImage:(NSImage *)image 
{ 
    NSData *imageData = [image TIFFRepresentation]; 
    NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData]; 
    imageData = [imageRep representationUsingType:NSPNGFileType properties:nil]; 


    NSString *base64 = [imageData encodeBase64WithNewlines: NO]; 

    NSString *jsonRequest = @"key=92428d1a5839df89cb8e87e8a31cd935&image="; 

    jsonRequest = [jsonRequest stringByAppendingString:[base64 stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]; 

    NSLog(@"Request: %@", jsonRequest); 

    NSData *requestData = [NSData dataWithBytes: [jsonRequest UTF8String] length: [jsonRequest length]]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://api.imgur.com/2/upload"]]; 
    [request setHTTPMethod: @"POST"]; 
    [request setHTTPBody: requestData]; 

    NSData *returnData = [ NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil ]; 
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

    NSLog(@"Returned Json: %@", returnString); 
} 

StatusItemView.m

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     NSArray *dragTypes = [NSArray arrayWithObjects:NSURLPboardType, NSFileContentsPboardType, NSFilenamesPboardType, nil]; 
     [self registerForDraggedTypes:dragTypes]; 
    } 

    return self; 
} 
//perform the drag and log the files that are dropped 
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender 
{ 
    NSPasteboard *pb = [sender draggingPasteboard]; 
    if([[pb pasteboardItems] count] != 1){ 
     return NO; 
    } 

    if([NSBitmapImageRep canInitWithPasteboard:pb]){ 
     NSImage *image = [[NSImage alloc] initWithPasteboard:pb]; 
     [[[ScreenshotController alloc] autorelease] uploadImage:image]; 

     return YES; 
    } 

    return NO; 
} 

这里是它上传到imgur的示例图像,所以你可以看到什么我的意思是:http://imgur.com/6pLgG(源文件是完全正常的PNG)。

完整源代码是在这里,如果你需要看别的:https://github.com/zbuc/imgur

回答

1

于是我想出了一个办法上传到匿名API,我希望这可以帮助了。

- (void)uploadImageToImgur{ 
NSData *_imageData = UIImageJPEGRepresentation(image,90); 
NSString *urlString = @"http://api.imgur.com/2/upload.json"; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init] ; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 

NSMutableData *body = [NSMutableData data]; 

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

// file 
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Disposition: attachment; name=\"image\"; filename=\".tiff\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[NSData dataWithData:_imageData]]; 
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

// text parameter 
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"key\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 

//Set API key 
[body appendData:[@"API_STRING_HERE" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

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

// set request body 
[request setHTTPBody:body]; 

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    NSArray *decodedResponse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; 

    NSString *imgurUrlString = [[[decodedResponse valueForKey:@"upload"] valueForKey:@"links"] valueForKey:@"imgur_page"];   

    [self uploadToImgurCompleteWithUrlString:imgurUrlString]; 

}]; 

}