c++ post multipart/form-data

2,448 阅读1分钟

参考

获取返回结果

#include <curl/curl.h>

#include <fstream>
#include <iostream>
#include <string>

using namespace std;


size_t WriteCallback(char *contents, size_t size, size_t nmemb, void *userp)
{
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}
int main() {
    std::string contents;
    std::string filename = "hello.txt";
    std::ifstream in(filename, std::ios::in | std::ios::binary);

    if (in) {
        in.seekg(0, std::ios::end);
        contents.resize(in.tellg());
        in.seekg(0, std::ios::beg);
        in.read(&contents[0], contents.size());
        in.close();
    }
    //##

    CURL *curl;
    CURLcode res;

    struct curl_httppost *formpost = NULL;
    struct curl_httppost *lastptr = NULL;
    struct curl_slist *headerlist = NULL;
    static const char buf[] = "Expect:";

    curl_global_init(CURL_GLOBAL_ALL);

    // set up the header
    curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME,
                 "cache-control:", CURLFORM_COPYCONTENTS, "no-cache",
                 CURLFORM_END);

    curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME,
                 "content-type:", CURLFORM_COPYCONTENTS, "multipart/form-data",
                 CURLFORM_END);

    curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME,
                 "file",  // <--- the (in this case) wanted file-Tag!
                 CURLFORM_BUFFER, "data", CURLFORM_BUFFERPTR, contents.data(),
                 CURLFORM_BUFFERLENGTH, contents.size(), CURLFORM_END);
    
    curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME,
                 "packageId",  // <--- the (in this case) wanted file-Tag!
                 CURLFORM_BUFFERPTR, "67",
                 CURLFORM_END);

    curl = curl_easy_init();

    headerlist = curl_slist_append(headerlist, buf);
    std::string readBuffer;
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8000");

        curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
        // curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

        res = curl_easy_perform(curl);
        /* Check for errors */
        if (res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                    curl_easy_strerror(res));
        } 
        cout<<readBuffer<<endl;
            

        curl_easy_cleanup(curl);

        curl_formfree(formpost);

        curl_slist_free_all(headerlist);
    }
}