2010-08-22 16 views
0

Je suis curieux de savoir pourquoi j'ai des problèmes avec cette fonction. Je télécharge un fichier PNG sur le Web vers un chemin de destination. Par exemple, en téléchargeant l'image Google sur le lecteur C:WinINet problème pour télécharger le fichier au client?

netDownloadData ("http://www.google.com/intl/en_ALL/images/srpr/logo1w.png", "c: \ file.png");

La taille du fichier est correcte après le téléchargement. Rien ne retourne faux. Lorsque j'essaie de l'ouvrir, l'image ne s'affiche pas. Toutes les idées sont utiles. Merci!

Voici le code:

bool netDownloadData(const char *strSourceUrl, const char *strDestPath) 
{ 

     HINTERNET hINet = NULL; 
    HINTERNET hFile = NULL; 
    char buffer[1024]; 
    DWORD dwRead; 
    String sTemp; 
    FILE *fp = NULL; 
    DWORD size = 0; 

    // Open a new internet session 
    hINet = netInit(); 
    if (hINet == NULL) { 
     sprintf(buffer, "Initializing WinINet failed.", strSourceUrl); 
     utilLog(buffer); 
     netCloseHandle(hINet); 
     return false; 
    } 

    // Open the requested url. 
    hFile = netOpenUrl(hINet, strSourceUrl); 
    if (hFile == NULL) { 
     sprintf(buffer, "URL failed upon loading: %s\n", strSourceUrl); 
     utilLog(buffer); 
     netCloseHandle(hINet); 
     return false; 
    } 

    // Read file. 
    while (InternetReadFile(hFile, buffer, 1023, &dwRead)) 
    { 
     if (dwRead == 0) 
      break; 

     buffer[dwRead] = 0; 

     sTemp += buffer; 
     size += dwRead; 
    } 

    // Load information to file. 
    fp = fopen(strDestPath, "wb"); 
    if (fp == NULL) 
     return false; 

    fwrite(sTemp, size, 1, fp); 
    fclose(fp); 

    InternetCloseHandle(hFile); 
    InternetCloseHandle(hINet); 

    return true; 
} 

Répondre

3

Quel type de données est String? Évitez de stocker des données binaires dans des chaînes car les valeurs NULL dans les données peuvent potentiellement causer des problèmes. Il suffit d'écrire le tampon comme et quand vous lisez:

// Load information to file. 
fp = fopen(strDestPath, "wb"); 
if (fp == NULL) 
    return false; 

// Read file. 
while (InternetReadFile(hFile, buffer, 1024, &dwRead)) 
{ 
    if (dwRead == 0) 
     break; 

    fwrite(buffer, dwRead, 1, fp); 
} 

fclose(fp); 
+0

J'ai bien travaillé. Merci! – Phil

0

Il semble que votre deuxième et troisième args à fwrite sont transposés. Voir fwrite docs pour l'explication.

essayer:

fwrite(sTemp, 1, size, fp); 
+0

Je ne pense pas que l'ordre est vraiment important, il a finalement écrit simplement 'la taille * count' octets de l'emplacement de départ. – casablanca

+0

@casablanca Intéressant que la commande n'a pas d'importance? On dirait que ça dépend d'un détail d'implémentation ... Belle prise sur le 'String', c'était un autre problème que je me posais. –

+0

Il est utilisé de manière interchangeable dans la page de référence que vous avez donnée. Le prototype est correct mais l'exemple est faux (s'il enseigne comment utiliser la fonction telle qu'elle est dans le prototype). Cela devrait être mis à jour. Pas la fin du monde cependant. – Phil