2014-12-16 3 views
3

Я знаю, что на этот вопрос был дан ответ несколько раз, но я попробовал все ответы без везения. Я не думаю, что я делаю что-то принципиально неправильное, но что-то здесь совершенно не так.AFNetworking 2 - Загрузка изображения - Не удалось выполнить запрос: не поддерживается тип носителя (415)

Я использую следующий код для загрузки файлов PNG в tinypng.com. Насколько я могу видеть, сама загрузка работает, но я получаю сообщение об ошибке: Не удалось выполнить запрос: неподдерживаемый тип носителя (415)

Изображения Я использую загружаются в формате JPEG, а затем изменены и преобразованы в формат PNG. Сохраненные файлы в порядке. Теперь я хочу отправить их в TinyPNG API, прежде чем я сохраню их на диске.

Если у кого-то есть идея, что случилось или у вас есть опыт работы с этим сервисом, пожалуйста, дайте мне знать. Спасибо заранее!

Подробное сообщение об ошибке

Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: unsupported media type (415)" 
UserInfo=0x6000000e4900 { 
    com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x600000220200> { URL: https://api.tinypng.com/shrink } 
    { 
     status code: 415, headers { 
      Connection = "keep-alive"; 
      "Content-Length" = 77; 
      "Content-Type" = "application/json; charset=utf-8"; 
      Date = "Tue, 16 Dec 2014 20:24:16 GMT"; 
      Server = "Apache/2"; 
      "Strict-Transport-Security" = "max-age=31536000"; 
      "X-Powered-By" = "Voormedia (voormedia.com/jobs)"; 
     } 
    }, 
    NSErrorFailingURLKey=https://api.tinypng.com/shrink, 
    com.alamofire.serialization.response.error.data=<7b226572 726f7222 3a224261 64536967 6e617475 
    7265222c 226d6573 73616765 223a2244 6f657320 6e6f7420 61707065 61722074 6f206265 20612050 
    4e47206f 72204a50 45472066 696c6522 7d>, 
    NSLocalizedDescription=Request failed: unsupported media type (415) 
} 

код я использую

-(void) uploadImage:(NSImage *)image { 

    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:TINY_PNG_URL]]; 

    CGImageRef cgRef = [image CGImageForProposedRect:NULL 
              context:nil 
               hints:nil]; 
    NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithCGImage:cgRef]; 
    [newRep setSize:[image size]]; // if you want the same resolution 
    NSData *imageData = [newRep representationUsingType:NSPNGFileType properties:nil]; 

    NSDictionary *parameters = @{@"username": USERNAME, @"password" : PASSWORD}; 

    AFHTTPRequestOperation *operation = [manager POST:@"" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 

     //append image 
     [formData appendPartWithFileData:imageData 
            name:@"filename" 
           fileName:@"photo.png" 
           mimeType:@"image/png"]; 

    } success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"Success: %@ ***** %@", operation.responseString, responseObject); 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@ ***** %@", operation.responseString, error); 
    }]; 

    [operation start]; 
} 

ответ

5

При поддержке Mattijs из TinyPNG я получил это работает! Спасибо Mattijs!

Проблема заключалась в том, что TinyPNG API ожидает, что тело запроса будет представлять собой только данные изображения, что не относится к кумулятивной форме данных, используемой в моем исходном коде.

Мой рабочий раствор:

-(void) uploadImage:(NSImage *)image { 

    NSData *imageData = [self PNGRepresentationOfImage:image]; 

    NSURL *url = [NSURL URLWithString:TINY_PNG_URL]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:imageData]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    [request setValue:@"image/png" forHTTPHeaderField:@"Content-Type"]; 

    NSString *authStr = [NSString stringWithFormat:@"%@:%@", USERNAME, PASSWORD]; 
    NSData *authData = [authStr dataUsingEncoding:NSASCIIStringEncoding]; 
    NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]]; 
    [request setValue:authValue forHTTPHeaderField:@"Authorization"]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
    operation.responseSerializer = [AFJSONResponseSerializer serializer]; 
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id result) { 
     NSLog(@"Success: %@ ***** %@", operation.responseString, result); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@ ***** %@", operation.responseString, error); 
    }]; 
    [operation start]; 
}