Objective-C/CocoaHTTPServer - вернуть изображение как ответ
У меня есть этот простой метод, который проверяет, передаю ли я такой параметр, как "/testPhoto", и, если он передан, я хочу попробовать ответить простым изображением, путь которого вы видите в переменной "testPath" (статический путь для попытки). В тот момент, когда я делаю запрос, я получаю от сервера статус 200 ok, но данные не передаются (0 байт). Мне нужно понять, что я делаю неправильно. Может быть, testPath не содержит правильный путь? Путь, который я использую, находится с помощью библиотеки ALAssetslibrary.
- (NSObject<HTTPResponse> *)httpResponseForMethod:(NSString *)method URI:(NSString *)path{
HTTPLogTrace();
if ([path isEqualToString:@"/testPhoto"]){
NSString *testPath = [[NSString alloc] init];
testPath = @"assets-library://asset/asset.JPG?id=DB96E240-8760-4FD6-B8B4-FEF3F61793B3&ext=JPG";
NSURL *deviceImageUrl = [[NSURL alloc] initWithString:testPath];
NSData *imageData = [NSData dataWithContentsOfURL:deviceImageUrl];
UIImage *deviceImage = [UIImage imageWithData:imageData];
HTTPDataResponse *photoResponse = [[HTTPDataResponse alloc] initWithData:imageData];
return photoResponse;
}
return nil;
}
Спасибо
1 ответ
Проблема в том, как вы получаете доступ к URL-адресу библиотеки ресурсов. Это не стандартный URL-адрес, и загрузка данных из URL-адреса библиотеки ресурсов не работает следующим образом. Вот пример, как это сделать: Получение NSData из NSURL
Следующий код основан на приведенном выше примере. Я не эксперт в ALAssetLibrary
так что попробуйте с осторожностью. Для того, чтобы асинхронная работа библиотеки ресурсов снова стала синхронной, необходим некоторый код:
- (NSObject<HTTPResponse> *)httpResponseForMethod:(NSString *)method URI:(NSString *)path{
HTTPLogTrace();
if ([path isEqualToString:@"/testPhoto"]){
NSData* __block data = nil;
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_get_main_queue();
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
ALAssetRepresentation *rep;
if([myasset defaultRepresentation] == nil) {
return;
} else {
rep = [myasset defaultRepresentation];
}
CGImageRef iref = [rep fullResolutionImage];
dispatch_sync(queue, ^{
UIImage *myImage = [UIImage imageWithCGImage:iref];
*data = UIImageJPEGRepresentation(myImage, 1);
});
dispatch_semaphore_signal(sema);
};
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
NSLog(@"Cant get image - %@",[myerror localizedDescription]);
dispatch_semaphore_signal(sema);
};
NSString *testPath = @"assets-library://asset/asset.JPG?id=DB96E240-8760-4FD6-B8B4-FEF3F61793B3&ext=JPG";
NSURL *deviceImageUrl = [[NSURL alloc] initWithString:testPath];
ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init]; //usin ARC , you have to declare ALAssetsLibrary as member variable
[assetslibrary assetForURL:deviceImageUrl
resultBlock:resultblock
failureBlock:failureblock];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
HTTPDataResponse *photoResponse = [[HTTPDataResponse alloc] initWithData:imageData];
return photoResponse;
}
return nil;
}