Objective c NSPasteBoard到base64的HTTP POST的NSImage未按预期工作

Objective c NSPasteBoard到base64的HTTP POST的NSImage未按预期工作,objective-c,macos,Objective C,Macos,我正在尝试创建一个小菜单项应用程序来学习Cocoa/OSX编程 基本上,它是放在你的基座上的东西,你把一个图像文件拖到它上面,它会把文件上传到imgur,并告诉你它上传到的URL 它“起作用”是因为imgur的API不会向我抛出任何错误,但图像也不能正确渲染 适用代码: ScreenshotController.m StatusItemView.m -(id)initWithFrame:(NSRect)frame { self=[super initWithFrame:frame]; 如果(自我

我正在尝试创建一个小菜单项应用程序来学习Cocoa/OSX编程

基本上,它是放在你的基座上的东西,你把一个图像文件拖到它上面,它会把文件上传到imgur,并告诉你它上传到的URL

它“起作用”是因为imgur的API不会向我抛出任何错误,但图像也不能正确渲染

适用代码:

ScreenshotController.m

StatusItemView.m

-(id)initWithFrame:(NSRect)frame
{
self=[super initWithFrame:frame];
如果(自我){
NSArray*dragTypes=[NSArray arrayWithObjects:NSURLPboardType,nsFileContentsBoardType,nsFileNamespoardType,nil];
[self RegisterForDragedTypes:dragTypes];
}
回归自我;
}
//执行拖放操作并记录拖放的文件
-(BOOL)performDragOperation:(id)发送方
{
NSPasteboard*pb=[发送方拖动粘贴板];
如果([[pb pasteboardItems]计数]!=1){
返回否;
}
if([NSBitmapImageRep CANITNITwithPasteBoard:pb]){
NSImage*image=[[NSImage alloc]initWithPasteboard:pb];
[[[ScreenshotController alloc]自动释放]上传图像:图像];
返回YES;
}   
返回否;
}
下面是一个上传到imgur的示例图像,您可以看到我的意思:(源文件是一个完全正常的PNG)


如果您需要查看其他内容,请参阅完整的源代码:

因此,我找到了一种上传到anon 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];

}];
}

- (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;
}
- (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];

}];