2009-07-30 2 views
9

Je télécharge un fichier en utilisant QNetworkAccessManager :: get mais contrairement à QHttp :: get il n'y a pas de façon intégrée d'écrire directement la réponse à un QIODevice différent.Écrire un QNetworkReply à un fichier

La meilleure façon serait de faire quelque chose comme ceci:

QIODevice* device; 

QNetworkReply* reply = manager.get(url); 
connect(reply, SIGNAL(readyRead()), this, SLOT(newData())); 

puis dans la fente newData:

device->write(reply->readAll()); 

Mais je ne suis pas sûr que ce soit la bonne façon, peut-être que je manqué quelque chose.

Répondre

7

Cela semble correct. Je voudrais utiliser les formes de niveau inférieur de read() et write(), pas les QByteArray, qui ne prennent pas en charge correctement la gestion des erreurs, mais à part cela, il semble bien.

Avez-vous des problèmes avec cela? Mieux utiliser le signal fini pour lire tout le contenu à la fin du processus de téléchargement.

+0

Je n'ai pas couru dans des problèmes à ce jour, mais je suis inquiet que si j'ai un grand nombre de téléchargements parallèles, toute cette opération pourrait causer un col de bouteille. –

+1

Peu probable, mais possible. Vous pouvez optimiser en utilisant une pile 'char buffer [4098]' pour éviter le 'malloc() s impliqué dans la création de' QByteArray'. Il y a aussi 'QVarLengthArray'. –

+0

ouais c'est ce que j'ai fait avec le tableau char local. Merci de votre aide. –

-1

Un exemple (enlever la boucle d'événements et d'utiliser un nouvel emplacement pour le rendre asynchrone):

QNetworkAccessManager manager; 
    QEventLoop loop; 
    QNetworkReply *reply = manager.get(request); 
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); 

    loop.exec(); 

    QFile file("YOUR FILE"); 
    file.open(QIODevice::WriteOnly); 
    file.write(reply->readAll()); 

    delete reply; 
+7

cela peut causer de sérieux problèmes de mémoire/performance en traitant de grandes requêtes –