Cómo guardar y recuperar un archivo descargado usando ASIHTTPRequest

Estoy haciendo varias descargas usando ASIHTTPRequest. Aquí se utiliza el método de descarga asincrónica, de modo que se pueden realizar varias descargas. Está funcionando bien. Ahora quiero guardar estos archivos de descarga en la carpeta local de la aplicación (en el dispositivo) y también quiero recuperarlos (quiero obtener la ruta de cada archivo). ¿Cómo puedo hacer esto? Y como aquí se están realizando varias descargas, ¿cómo puedo diferenciar cada archivo en las descargas? Aquí está el código que he usado.

- (void)download{
    UIImageView *image = (UIImageView *)[mainView viewWithTag:selectedTag];

    for (UIProgressView *currentProgress in [image subviews]) {
        if ([currentProgress isKindOfClass:[UIProgressView class]]) {
            NSLog(@"Prog tag: %d",currentProgress.tag);
            if(currentProgress)
            {
                currentProgress.progress = 0.0;
                ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:[urlArray objectAtIndex:selectedTag]]];
                [request setDownloadProgressDelegate:currentProgress];
                [request setShowAccurateProgress:YES];                
                [request setDownloadDestinationPath:[[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"mansory_porsche_carrera_3-1920x1200.jpg"]];
                [request shouldContinueWhenAppEntersBackground];
                [request allowResumeForFileDownloads];
                [request startAsynchronous];

            }
        }
    }
}

preguntado el 03 de mayo de 12 a las 07:05

2 Respuestas

Puede modificar estas funciones en consecuencia y puede guardar cualquier archivo que desee.

- (NSString *)applicationDocumentsDirectory 
{
  return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

- (void)saveImage:(UIImage*)image:(NSString*)imageName 
{
 NSData *imageData = UIImagePNGRepresentation(image); //convert image into .png format.

 NSFileManager *fileManager = [NSFileManager defaultManager];//create instance of NSFileManager

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //create an array and store result of our search for the documents directory in it

 NSString *documentsDirectory = [paths objectAtIndex:0]; //create NSString object, that holds our exact path to the documents directory

 NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", imageName]]; //add our image to the path 

 [fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; //finally save the path (image)

 NSLog(@"image saved");
}

Y para recuperar puede usar estas líneas para verificar si el archivo existe o no:

NSString *cachedImageFileUrl = [documentsDirectory stringByAppendingPathComponent:yourFileName];

NSFileManager *fileManager = [NSFileManager defaultManager];
if([fileManager fileExistsAtPath])
{
  //File exists...
}
else
{
}

Dime si te ayuda!!!

contestado el 03 de mayo de 12 a las 07:05

tengo algunas dudas, ¿cómo puedo llamar a esto - (void)saveImage:(UIImage*)image:(NSString*)imageName en mi código? No puedo decir el nombre del código y el tipo de archivo puede variar. - Mithuzz

En primer lugar, decida si desea utilizar bloques o utilizar funciones delegadas.

Si desea usar bloques, dado que ASIHTTPRequest es una subclase de NSOperation, puede usar -setComplectionBlock para crear una devolución de llamada que se llamará cuando esta solicitud en particular haya terminado de descargarse.

Si desea utilizar funciones de delegado, configure el delegado de cada solicitud en su objeto deseado (su controlador puede serlo) y luego implemente en el mismo objeto -requestFinished y -requestFailed para que pueda manejar las respuestas.

Cada vez que una URL haya terminado de descargarse, se llamará a la devolución de llamada con la solicitud que descargó el archivo como argumento. Esta solicitud tiene el objeto -responseData, que cuando finalice la solicitud, se completará con los datos descargados. Estos serán sus datos de imagen.

Esta es la forma normal y más conocida. Ahora, parece que lo está haciendo directamente, ¡pero ha configurado cada solicitud para escribir en el mismo archivo en el disco! ¿Está seguro de que obtendrá los datos que desea de varias imágenes de esta manera? ¡Me parece que los datos de la imagen se superpondrán durante la descarga!

Esto es lo que haría: descargaría cada imagen y, mientras descargaba cada una, usaría una función de devolución de llamada para cambiar el nombre del archivo resultante. Después de eso, desde dentro de la misma devolución de llamada, almacenaría el nombre del archivo real dentro de un NSMutableDictionary en mi controlador. Algo así como [myDict setValue:"path/to/image.png" forKey:"myImage1"] para que pueda acceder a ellos más tarde.

<< En una nota al margen, creo que debería abandonar AIHTTPRequest, ya que ha sido abandonado pero el desarrollador. Puede utilizar AFNetworking como una gran alternativa. También proporciona devoluciones de llamadas de progreso y está basado en bloques. Si desea compatibilidad con versiones anteriores a iOS 4.0, ignore el último párrafo. >>

contestado el 03 de mayo de 12 a las 08:05

gracias por la respuesta. Quiero que mi aplicación también sea compatible con versiones anteriores a iOS 4.0. Así que creo que debería usar ASIHTTPRequest. Y en el código acabo de dar un nombre de muestra y los archivos deben ser dinámicos. Entonces, ¿puedes mostrarme un código de muestra? - Mithuzz

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.