Получение NSData из NSURL
Я пытаюсь загрузить фотографию из своего приложения в веб-сервис.
Поток, который я пытаюсь создать, выглядит следующим образом:
- Пользователь снимает фото с камеры
- Фото сохранено в фотопленке под пользовательским альбомом
- URL сохраненной фотографии передается в мой магазин
- Магазин пытается загрузить фотографию в веб-сервис.
Я пытаюсь использовать NSData *data = [NSData dataWithContentsOfURL:[item assetURL]]
где item - модель, которая содержит соответствующий URL. Но эта строка не производит данные, когда я регистрирую их, даже если она производит URL: "assets-library://asset/asset.PNG?id=28DBC0AC-21FF-4560-A9D6-5F4BCA190BDB&ext=PNG"
Фрагменты кода следующие:
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
[self dismissViewControllerAnimated:YES completion:^(void){
[library writeImageToSavedPhotosAlbum:image.CGImage orientation:image.imageOrientation completionBlock:^(NSURL* assetURL, NSError* error) {
BCard *card = [[BCard alloc]init];
//error handling
if (error!=nil) {
NSLog(@"[ERROR] - %@",error);
return;
}
//add the asset to the custom photo album
[library addAssetURL: assetURL
toAlbum:@"Business Cards"
withCompletionBlock:^(NSError *error) {
if (error!=nil) {
NSLog(@"Custom Album Error: %@", [error description]);
}
}];
[card setAssetURL:assetURL];
[[BCardStore sharedStore]addToQueue:card];
int index = [[[BCardStore sharedStore]getQueue]count]-1;
[[BCardStore sharedStore]uploadItemAtIndex:index withProgressBlock:nil withExitBlock:nil];
}];
}];
}
а также
-(void)uploadItemAtIndex:(NSUInteger)index withProgressBlock:(progressBlock)pBlock withExitBlock:(exitBlock)eBlock
{
BCard *item = [uploadQueue objectAtIndex:index];
NSURL *url = [NSURL URLWithString:@"http://192.168.0.116:8080"];
NSData *data = [NSData dataWithContentsOfURL:[item assetURL]];
AFHTTPClient *httpClient = [[AFHTTPClient alloc]initWithBaseURL:url];
numberedName = numberedName +1;
NSString *name = [NSString stringWithFormat:@"%d",numberedName];
NSLog(@"%@",[item assetURL]);
//upload data using AFNetworking here
}
Фрагмент [library addAssetUrl:NSUrl toAlbum:NSString withCompletionBlock:^(NSError *error)]
пришел из категории, которую я нашел здесь.
Я действительно получаю правильный URL здесь или я использую dataWithContentsOfURL
неправильно?
1 ответ
Единственный способ - вы можете получить UIImage из библиотеки фотографий, используя URL-адрес ALAsset, и преобразовать его в NSData.
Добавить ALAssetLibrary
Импорт файла заголовка ALAssetLibrary
-(void)uploadItemAtIndex:(NSUInteger)index
withProgressBlock:(progressBlock)pBlock
withExitBlock:(exitBlock)eBlock
{
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
ALAssetRepresentation *rep;
if([myasset defaultRepresentation] == nil) {
return;
} else {
rep = [myasset defaultRepresentation];
}
CGImageRef iref = [rep fullResolutionImage];
dispatch_sync(dispatch_get_main_queue(), ^{
UIImage *myImage = [UIImage imageWithCGImage:iref];
NSData *data = //convert the myImage to NSData
BCard *item = [uploadQueue objectAtIndex:index];
NSURL *url = [NSURL URLWithString:@"http://192.168.0.116:8080"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc]initWithBaseURL:url];
numberedName = numberedName +1;
NSString *name = [NSString stringWithFormat:@"%d",numberedName];
//upload data using AFNetworking here
});//end block
};
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
NSLog(@"Cant get image - %@",[myerror localizedDescription]);
};
NSURL *asseturl =
[NSURL URLWithString:[self.photoPath objectAtIndex:[arrayIndex intValue] ]];
//using ARC , you have to declare ALAssetsLibrary as member variable
ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
[assetslibrary assetForURL:assetURL
resultBlock:resultblock
failureBlock:failureblock];
}