1

C++ アプリケーションを開発しています。ファイルをダウンロードします。典型的な URL は https://mysite.com/download.php?fileid=xxx のようになります。最初の問題は、実際のファイル名を取得する必要があることです。私はそれを次のようにします:

curl_easy_setopt(pCurl, CURLOPT_HEADERFUNCTION, readHeader);

そしてコールバック

size_t NetworkHelper::readHeader(void *ptr, size_t size, size_t nmemb, void *data)
{
        std::string header;
        header.assign((char*)ptr, nmemb);
    size_t delimPos = header.find_first_of(':');
    std::string headerName;
    std::string headerContent;
    if (delimPos != std::string::npos)
    {
        headerName = header.substr(0, delimPos);
        headerContent = header.substr(delimPos + 1, header.length());
        m_headers[headerName] = headerContent;
    }
    return size*nmemb;
}

ここでは、ヘッダーとその値をマップに挿入します。このコールバックは、http ヘッダーごとに何度も呼び出されます。本当に必要なヘッダーは「場所: url/実ファイル名.yyy」です。

そしてコールバックを書く:

size_t NetworkHelper::writeFileCallback(void* ptr, size_t size, size_t nmemb, void* data)
{
    size_t count;
    Fetchdata* fetchdata;
    fetchdata = (Fetchdata*)data;
    std::string fileName = NetworkHelper::m_headers["Location"].c_str();
    fileName = "C:/" + fileName.substr(fileName.find_last_of('/') + 1, fileName.length());
    fetchdata->stream = fopen( fileName.c_str(),"w+b");
    if (fetchdata->stream!=NULL)
    {
        count = fwrite(ptr, size, nmemb, fetchdata->stream);
        if (count > 0) 
        {
            fetchdata->size += (count * size);
        }
    }
    return nmemb*size;
}

ここで fopen は失敗します (NULL を返します)。ファイルを処理する方法と、より良い方法で処理する方法は間違っていますか? ありがとう。

4

1 に答える 1

1

最初に、fileName に実際に何が含まれているかを確認します。Windows で error() または GetLastError を使用して、何が問題なのかを確認します。私は間違っているかもしれませんが、あなたのコードによると fileName には実際には次のようなものが含まれています: C:/ http://somesimet.somedomain/file.extension upd: すみません、ファイル名について本当に間違っていました

于 2013-04-08T12:03:31.497 に答える