Vraag iOS: download afbeelding van de URL en sla op op het apparaat


Ik probeer de afbeelding van de url te downloaden http://a3.twimg.com/profile_images/414797877/05052008321_bigger.jpg

Ik gebruik de volgende code, maar de afbeelding wordt niet opgeslagen op het apparaat. Ik wil weten wat ik verkeerd doe.

 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://a3.twimg.com/profile_images/414797877/05052008321_bigger.jpg"]];
 [NSURLConnection connectionWithRequest:request delegate:self];

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:@"pkm.jpg"];
 NSData *thedata = NULL;
 [thedata writeToFile:localFilePath atomically:YES];

 UIImage *img = [[UIImage alloc] initWithData:thedata];

44
2018-03-23 10:44


oorsprong


antwoorden:


Als je instelt theData naar nil, wat verwacht je dat het naar de schijf schrijft?

Wat je kunt gebruiken is NSData* theData = [NSData dataWithContentsOfURL:yourURLHere]; om de gegevens van de schijf te laden en vervolgens op te slaan met writeToFile:atomically:. Als u meer controle over het laadproces nodig hebt of op de achtergrond hebt, kijk dan naar de documentatie van NSURLConnection en de bijbehorende gids.


35
2018-03-23 10:54



Ik heb toevallig precies wat je zoekt.

Afbeelding van URL ophalen

-(UIImage *) getImageFromURL:(NSString *)fileURL {
    UIImage * result;

    NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
    result = [UIImage imageWithData:data];

    return result;
}

Afbeelding opslaan

-(void) saveImage:(UIImage *)image withFileName:(NSString *)imageName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath {
    if ([[extension lowercaseString] isEqualToString:@"png"]) {
        [UIImagePNGRepresentation(image) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]] options:NSAtomicWrite error:nil];
    } else if ([[extension lowercaseString] isEqualToString:@"jpg"] || [[extension lowercaseString] isEqualToString:@"jpeg"]) {
        [UIImageJPEGRepresentation(image, 1.0) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]] options:NSAtomicWrite error:nil];
    } else {
        NSLog(@"Image Save Failed\nExtension: (%@) is not recognized, use (PNG/JPG)", extension);
    }
}

Afbeelding laden

-(UIImage *) loadImage:(NSString *)fileName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath {
    UIImage * result = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.%@", directoryPath, fileName, extension]];

    return result;
}

Hoe

//Definitions
NSString * documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

//Get Image From URL
UIImage * imageFromURL = [self getImageFromURL:@"http://www.yourdomain.com/yourImage.png"];

//Save Image to Directory
[self saveImage:imageFromURL withFileName:@"My Image" ofType:@"png" inDirectory:documentsDirectoryPath];

//Load Image From Directory
UIImage * imageFromWeb = [self loadImage:@"My Image" ofType:@"png" inDirectory:documentsDirectoryPath];

98
2018-06-03 19:21



Dit is de code om de afbeelding uit de URL te downloaden en die afbeelding op te slaan op het apparaat en deze is de referentielink.

 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://a3.twimg.com/profile_images/414797877/05052008321_bigger.jpg"]];
 [NSURLConnection connectionWithRequest:request delegate:self];

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:@"pkm.jpg"];
 NSData *thedata = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://a3.twimg.com/profile_images/414797877/05052008321_bigger.jpg"]];
 [thedata writeToFile:localFilePath atomically:YES];

9
2018-05-10 14:24



Afbeelding van URL ophalen

-(UIImage *) getImageFromURL:(NSString *)fileURL {
    UIImage * result;

    NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
    result = [UIImage imageWithData:data];

    return result;
}

Dit werkte prima voor mij, maar ik kreeg geheugenproblemen met CFData (winkel). Opgelost met een autoreleasepool:

 -(UIImage *) getImageFromURL:(NSString *)fileURL {
    @autoreleasepool {
     UIImage * result;

     NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
     result = [UIImage imageWithData:data];

     return result;
    }
 }

4
2017-12-03 22:24



Omdat we nu op IOS6 zijn, hoeft u niet langer afbeeldingen naar de schijf te schrijven.
Sinds iOS5 kun je nu "allow external storage" instellen op een coredata binair attribuut. Volgens appels release notes betekent dit het volgende:

Kleine gegevenswaarden zoals afbeeldingsminiaturen kunnen efficiënt worden opgeslagen in een   database, maar laarge-foto's of andere media kunnen het best direct worden verwerkt door   het bestandssysteem. U kunt nu opgeven dat de waarde van een beheerd   objectkenmerk kan worden opgeslagen als een extern record - zie setAllowsExternalBinaryDataStorage:   Indien ingeschakeld, bepalen Core Data heuristisch per waarde als   het zou de gegevens direct in de database moeten opslaan of een URI moeten opslaan in a   afzonderlijk bestand dat het voor u beheert. U kunt niet zoeken op basis van de   inhoud van een binaire gegevenseigenschap als u deze optie gebruikt.


2
2018-03-23 10:54



Hallo Het is duidelijk dat u NULL-gegevens naar uw bestand schrijft.

In uw codeverklaring NSData * thedata = NULL; geeft aan dat u de NULL-waarde aan uw gegevens toewijst.

Je schrijft ook NULL-gegevens in je bestand.

Controleer nogmaals uw code.


2
2018-03-27 07:14



-(IBAction)BtnDwn:(id)sender
{
  [self.actvityIndicator startAnimating];

  NSURL *URL = [NSURL URLWithString:self.dataaArray];
  NSURLRequest *request = [NSURLRequest requestWithURL:URL];
  NSURLSession *session = [NSURLSession sharedSession];

  NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error)
   {

      NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
      NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:documentsPath];
      NSURL *documentURL = [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
      BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:[documentURL path]];

      if (exists)
      {
         NSLog(@"not created");
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Download"
                                                    message:@"sory,file already exists"
                                                   delegate:nil
                                          cancelButtonTitle:@"cancel"
                                          otherButtonTitles:nil];
         [alert show];
      }
      else
      { 
         [[NSFileManager defaultManager] moveItemAtURL:location toURL:documentURL error:nil];
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Download"
                                                    message:@"Succesfully downloaded"
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
         [self.actvityIndicator stopAnimating];
         NSLog(@"wait downloading......");
         [alert show];
     }
  }];

    [downloadTask resume];    
}

2
2018-04-05 23:42