2012-02-26 12 views
2

Cocoa/OS Xプログラミングを学ぶための小さなメニュー項目を作成しようとしています。HTTP POSTのNSPasteBoardからbase64へのNSImageが正常に動作しない

基本的にはドックに座って画像ファイルをドラッグし、ファイルを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でした)。

答えて

1

https://github.com/zbuc/imgurは、だから私はアノン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]; 

}]; 

}