如何从服务器检索图像集并将其存储在iOS的文档目录中?

时间:2013-02-19 06:16:03

标签: ios objective-c cocoa-touch

我想从服务器检索包含10个图像的文件夹,然后将该文件夹存储在我的文档目录中。我做了一些代码,但是当我运行它时,我得到的是图像网址,而不是图像本身。任何人都可以帮助我吗?

我的代码:

-(void)viewWillAppear:(BOOL)animated
{

NSMutableData *receivingData = [[NSMutableData alloc] init];
NSURL *url = [NSURL URLWithString:@"http://Someurl.filesCount.php"];
NSURLRequest *req = [NSURLRequest requestWithURL:url];


   NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];

}

-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{

[receivingData appendData:data];
}
-(void) connectionDidFinishLoading:(NSURLConnection *)connection
{
NSError *error = nil;

{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
printf("\n the path is :%s",[path UTF8String]);


NSString *zipPath = [path stringByAppendingPathComponent:@"filesCount.php"];

[receivingData writeToFile:zipPath options:0 error:&error];



        NSString *documentsDirectoryPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"filesCount"];
        NSLog(@"the path %@",documentsDirectoryPath);



}

4 个答案:

答案 0 :(得分:1)

我在之前的项目中创建了这个功能。您需要传递imageView和serverUrl,然后在imageView中自动显示图像并将图像保存到临时目录,如果您想再次获取相同的图像,则下次从磁盘获取图像。

+(void)downloadingServerImageFromUrl:(UIImageView*)imgView AndUrl:(NSString*)strUrl{

NSFileManager *fileManager =[NSFileManager defaultManager];

NSString* theFileName = [NSString stringWithFormat:@"%@.png",[[strUrl lastPathComponent] stringByDeletingPathExtension]];
NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",theFileName]];


imgView.backgroundColor = [UIColor darkGrayColor];
UIActivityIndicatorView *actView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[imgView addSubview:actView];
[actView startAnimating];
CGSize boundsSize = imgView.bounds.size;
CGRect frameToCenter = actView.frame;
// center horizontally
if (frameToCenter.size.width < boundsSize.width)
    frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2;
else
    frameToCenter.origin.x = 0;

// center vertically
if (frameToCenter.size.height < boundsSize.height)
    frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2;
else
    frameToCenter.origin.y = 0;

actView.frame = frameToCenter;


dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{

    NSData *dataFromFile = nil;
    NSData *dataFromUrl = nil;

    dataFromFile = [fileManager contentsAtPath:fileName];
    if(dataFromFile==nil){
        dataFromUrl=[[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strUrl]] autorelease];
    }

    dispatch_sync(dispatch_get_main_queue(), ^{

        if(dataFromFile!=nil){
            imgView.image = [UIImage imageWithData:dataFromFile];
        }else if(dataFromUrl!=nil){
            imgView.image = [UIImage imageWithData:dataFromUrl];
            // NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",theFileName]];

            BOOL filecreationSuccess = [fileManager createFileAtPath:fileName contents:dataFromUrl attributes:nil];
            if(filecreationSuccess == NO){
                NSLog(@"Failed to create the html file");
            }

        }else{
            imgView.image = [UIImage imageNamed:@"NO_Image.png"];
            imgView.tag = 105;
        }
        [actView removeFromSuperview];
        [actView release];
    });
});

}

答案 1 :(得分:0)

如果您要在UI上显示从服务器加载的图像,那么

尝试SDWebImageView,可以与UIButton或UIImageView一起使用,非常简单高效。

例如,

[yourImageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
               placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

阅读how to use it?

好的,现在对于多个图片,您可能需要运行一个循环,如果您的所有图片都有一个共同的基本网址(在服务器上),http://yoururl/server/pictures/1.png之类的内容将由2.png 3.png ... n.png替换或者你得到的图片需要传递不同的网址,你可以将它加载到imageview对象中,然后将它们保存到文档目录中(记住,SDWebImageView默认为你做这项工作)。你也可以关闭它。

P.S。它将加载一次图像并将其存储到本地(缓存)中,下次当您传递相同的图像URL时,它将不会从服务器加载并直接从本地加载图像。

答案 2 :(得分:0)

尝试使用此代码。

 NSURL* url = [NSURL URLWithString:@"http://imageAddress.com"];
 NSURLRequest* request = [NSURLRequest requestWithURL:url];


[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse * response,
    NSData * data,
    NSError * error) {
if (!error){
        // do whatever you want with directory or store images.
    NSImage* image = [[NSImage alloc] initWithData:data];

}

}];

答案 3 :(得分:0)

使用此代码使用URL下载图像并存储在文档目录中。迭代要下载和存储的图像集的逻辑。

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
        NSString *imageURL = @"http://sampleUrl";
        NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
        UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]]];

        NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"Image1.png"]];
        if(image != NULL)
        {
            //Store the image in Document
            NSData *imageData = UIImagePNGRepresentation(image);
            [imageData writeToFile: imagePath atomically:YES];
        }