iOS: Download Bild von URL und speichern in Gerät
-
21-09-2019 - |
Frage
Ich versuche, das Bild aus der URL http herunterladen: //a3.twimg. com / profile_images / 414797877 / 05052008321_bigger.jpg
Ich verwende den folgenden Code, aber Bild wird nicht im Gerät gespeichert. Ich will wissen, was ich falsch mache.
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];
Lösung
Wenn Sie Satz theData
zu nil
, was erwarten Sie, es zu schreiben auf die Festplatte?
Was können Sie verwenden, ist NSData* theData = [NSData dataWithContentsOfURL:yourURLHere];
die Daten von der Festplatte zu laden und speichern Sie es writeToFile:atomically:
verwenden. Wenn Sie mehr Kontrolle über den Ladevorgang benötigen oder es im Hintergrund, Blick in der Dokumentation von NSURLConnection
und dem zugehörigen Handbuch.
Andere Tipps
ich zufällig genau das, was Sie suchen.
Get Bild von URL
-(UIImage *) getImageFromURL:(NSString *)fileURL {
UIImage * result;
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
result = [UIImage imageWithData:data];
return result;
}
Bild speichern
-(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);
}
}
Bild laden
-(UIImage *) loadImage:(NSString *)fileName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath {
UIImage * result = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.%@", directoryPath, fileName, extension]];
return result;
}
How-To
//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];
Dies ist der Code, um das Bild von URL zum Download und das Bild in dem Gerät speichern und diese ist die Referenzverbindung.
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];
Get Bild von URL
-(UIImage *) getImageFromURL:(NSString *)fileURL { UIImage * result; NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]]; result = [UIImage imageWithData:data]; return result; }
Das funktionierte gut für mich, aber ich lief in den Speicher Probleme mit cfdata (Speicher). Fest es mit einem autoreleasepool:
-(UIImage *) getImageFromURL:(NSString *)fileURL {
@autoreleasepool {
UIImage * result;
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
result = [UIImage imageWithData:data];
return result;
}
}
Da wir auf iOS6 sind jetzt, Sie nicht mehr benötigen, um Schreib Bilder auf der Festplatte neccessarily.
Seit iOS5 sind Sie nun in der Lage, um „erlauben externe Speicher“ auf einem Coredata Binärattribut.
Nach Äpfel Release Notes es bedeutet folgendes:
Kleine Datenwerte wie Bild Thumbnails effizient in einem gespeichert werden können Datenbank, aber laarge Fotos oder andere Medien werden am besten direkt behandelt durch das Dateisystem. Sie können nun festlegen, dass der Wert eines verwalteten Objektattribut kann als externen Datensatz gespeichert werden - siehe setAllowsExternalBinaryDataStorage: Wenn diese Funktion aktiviert, entscheidet Core Data heuristisch auf einer Pro-Value-Basis, wenn es sollte die Daten direkt in der Datenbank speichern oder einen URI zu einem Speicher separate Datei, die es für Sie verwaltet. Sie können keine Abfrage auf der Basis Wenn Sie Inhalte einer binären Daten Eigenschaft verwenden Sie diese Option.
Hallo Es ist klar, dass Sie NULL-Daten zu Ihrer Datei schreiben.
In der Code-Anweisung NSData * theData = NULL; zeigt an, dass Sie NULL-Wert auf Ihre Daten assign.
Sie sind auch NULL Daten auf Ihre Datei zu schreiben.
Bitte überprüfen Sie den Code erneut.
-(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];
}
Hier ist, wie Sie ein Bild asynchron in Swift speichern können:
requestImage("http://www.asdf.com/89asdf.gif") { (image) -> Void in
let myImage = image
}
func requestImage(url: String, success: (UIImage?) -> Void) {
requestURL(url, success: { (data) -> Void in
if let d = data {
success(UIImage(data: d))
}
})
}
func requestURL(url: String, success: (NSData?) -> Void, error: ((NSError) -> Void)? = nil) {
NSURLConnection.sendAsynchronousRequest(
NSURLRequest(URL: NSURL (string: url)!),
queue: NSOperationQueue.mainQueue(),
completionHandler: { response, data, err in
if let e = err {
error?(e)
} else {
success(data)
}
})
}
Seine enthalten als Standardfunktion in meinem Repo:
Hier ist ein Beispiel dafür, wie ich Banner auf meine App herunterladen. Ich laden Sie die Bilder in den Hintergrund, und die meisten meiner apps nicht Verweiszählung verwenden, damit ich Objekte freigeben.
- (void)viewDidLoad {
[super viewDidLoad];
[NSThread detachNewThreadSelector:@selector(loadImageInBackground) toTarget:self withObject:nil];
}
- (void) loadImageInBackground {
NSURL *url = [[NSURL alloc] initWithString:@"http://yourImagePath.png"];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
[url release];
UIImage *result = [[UIImage alloc] initWithData:data];
[data release];
UIImageView *banner_ImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
[self.view addSubview:banner_ImageView];
banner_ImageView.image = result;
[result release];
}