50 votes

Comment télécharger un fichier et l'enregistrer dans le répertoire des documents avec AFNetworking ?

J'utilise la bibliothèque AFNetworking. Je n'arrive pas à comprendre comment télécharger un fichier et l'enregistrer dans le répertoire des documents.

2voto

Satyam Raikar Points 439
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

manager.responseSerializer = [AFCompoundResponseSerializer serializer];

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/octet-stream"];

AFHTTPRequestOperation *operation = [manager GET:url   parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    if (responseObject) {
        // your code here
    } else {
        // your code here
    }
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}];

[operation start];

// manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject : @ "application/octet-stream"] ; peut varier en fonction de ce que vous attendez.

1voto

wzbozon Points 2851

Oui, il est préférable d'utiliser AFNetworking 2.0 avec AFHTTPRequestOperationManager . Avec l'ancienne méthode, mon fichier a été téléchargé mais pour une raison quelconque, il n'a pas été mis à jour dans le système de fichiers.

Ajouté à swilliam's réponse, pour montrer la progression du téléchargement, en AFNetworking 2.0 vous faites de même - il suffit de définir le bloc de progression du téléchargement après avoir défini le flux de sortie.

__weak SettingsTableViewController *weakSelf = self;

operation.outputStream = [NSOutputStream outputStreamToFileAtPath:newFilePath append:NO];

[operation setDownloadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToRead) {

    float progress = totalBytesWritten / (float)totalBytesExpectedToRead;

    NSString *progressMessage = [NSString stringWithFormat:@"%@ \n %.2f %% \n %@ / %@", @"Downloading ...", progress * 100, [weakSelf fileSizeStringWithSize:totalBytesWritten], [weakSelf fileSizeStringWithSize:totalBytesExpectedToRead]];

    [SVProgressHUD showProgress:progress status:progressMessage];
}];

C'est ma méthode pour créer une chaîne d'octets :

- (NSString *)fileSizeStringWithSize:(long long)size
{
    NSString *sizeString;
    CGFloat f;

    if (size < 1024) {
        sizeString = [NSString stringWithFormat:@"%d %@", (int)size, @"bytes"];
    }
    else if ((size >= 1024)&&(size < (1024*1024))) {
        f = size / 1024.0f;
        sizeString = [NSString stringWithFormat:@"%.0f %@", f, @"Kb"];
    }
    else if (size >= (1024*1024)) {
        f = size / (1024.0f*1024.0f);
        sizeString = [NSString stringWithFormat:@"%.0f %@", f, @"Mb"];
    }

    return sizeString;
}

0voto

joe Points 153

En plus des réponses précédentes, avec AFNetworking 2.5.0 et iOS7/8, j'ai constaté que l'étape supplémentaire d'ouverture du flux de sortie est également nécessaire pour empêcher l'application de se bloquer (et finalement de se planter par manque de mémoire).

operation.outputStream = [NSOutputStream outputStreamToFileAtPath:dest
                                                          append:NO];
[operation.outputStream open];
[operation start];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X