【问题标题】:WinINet trouble downloading file to client?WinINet 无法将文件下载到客户端?
【发布时间】:2011-04-02 04:22:38
【问题描述】:

我很好奇为什么我在使用此功能时遇到问题。我正在将网络上的 PNG 文件下载到目标路径。比如下载谷歌图片到C:盘:

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

下载后文件大小正确。没有返回错误。当我尝试打开它时,它不会显示图像。任何想法都是有帮助的。谢谢!

代码如下:

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;
}

【问题讨论】:

    标签: c++ c winapi winsock wininet


    【解决方案1】:

    String 是什么数据类型?避免将二进制数据存储在字符串中,因为数据中的 NULL 可能会导致问题。只需在读取时写入缓冲区即可:

    // 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); 
    

    【讨论】:

      【解决方案2】:

      看起来你对fwrite 的第二个和第三个参数被转置了。解释见fwrite docs

      尝试:

      fwrite(sTemp, 1, size, fp);
      

      【讨论】:

      • 我认为顺序并不重要,它最终只是从起始位置写入size * count 字节。
      • @casablanca 订单无关紧要有趣吗?似乎依赖于实现细节...很好地抓住了String,这是我想知道的另一个问题。
      • 它在您提供的参考页面中可以互换使用。原型是正确的,但示例是错误的(如果它正在教如何使用原型中的函数)。它应该被更新。不过,这不是世界末日。
      • 我相信这实际上是标准行为,虽然我不知道为什么 freadfwrite 是这样定义的。
      • 关于这些参数的推理的上一个问题:stackoverflow.com/questions/295994/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多