libcurl http post 二进制流(文件片段上传)

7 篇文章 0 订阅
2 篇文章 1 订阅

linux C/++ libcurl form-data 表单post 二进制数据流到后台服务器

/*
        添加form-data 表单项 以提交文件片段为例
        文件分片form字段

*/
int WebUploader::curlPostSlice(SliceFile& file,int sliceIndex,string &zoneMd5)
{
    struct curl_httppost *formpost = NULL;
    struct curl_httppost *lastptr = NULL;

    CURLFORMcode  resultForm;
    int ret =0;

    struct curl_httppost *p = NULL;


    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "id",
            CURLFORM_COPYCONTENTS, (const char *) "WU_FILE_0", CURLFORM_END );

    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "name",
            CURLFORM_COPYCONTENTS, (const char *) file.file_name().c_str(), CURLFORM_END );

    //application/octet-stream
    //video/mp4

    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "type",
            CURLFORM_COPYCONTENTS, (const char *) file.content_type().c_str(), CURLFORM_END );

    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "lastModifiedDate",
            CURLFORM_COPYCONTENTS, (const char *) file.lastModifiedDate().c_str(), CURLFORM_END );

    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "size",
            CURLFORM_COPYCONTENTS, (const char *) to_string(file.file_size()).c_str(), CURLFORM_END );

    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "chunk",
            CURLFORM_COPYCONTENTS, (const char *) to_string(sliceIndex).c_str(), CURLFORM_END );

    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "fileMd5",
            CURLFORM_COPYCONTENTS, (const char *) file.file_md5().c_str(), CURLFORM_END );


    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "contentType",
            CURLFORM_COPYCONTENTS, (const char *) file.content_type().c_str(), CURLFORM_END );

    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "zoneTotalMd5",
            CURLFORM_COPYCONTENTS, (const char *) file.file_md5().c_str(), CURLFORM_END );

    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "zoneMd5",
            CURLFORM_COPYCONTENTS, (const char *) zoneMd5.c_str(), CURLFORM_END );


    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "zoneTotalCount",
            CURLFORM_COPYCONTENTS, (const char *) to_string(file.slice_num()).c_str(), CURLFORM_END );


    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "zoneNowIndex",
            CURLFORM_COPYCONTENTS, (const char *) to_string(sliceIndex).c_str(), CURLFORM_END );

    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "zoneTotalSize",
            CURLFORM_COPYCONTENTS, (const char *) to_string(file.file_size()).c_str(), CURLFORM_END );


    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "zoneStartSize",
            CURLFORM_COPYCONTENTS, (const char *) to_string(file.slice_size()*sliceIndex).c_str(), CURLFORM_END );

    //Content-Disposition: form-data; name="zoneEndSize"
    //
    //386726
    int zoneEndSize = file.slice_size()*(sliceIndex+1) > file.file_size()? file.file_size(): file.slice_size()*(sliceIndex+1);
    resultForm = curl_formadd( &formpost, &lastptr, CURLFORM_COPYNAME, "zoneEndSize",
            CURLFORM_COPYCONTENTS, (const char *) to_string(zoneEndSize).c_str(), CURLFORM_END );

    //Content-Disposition: form-data;name="file";filename="yolov5s_zhc_foodSmokePhone_13330_300_960_2022-05-12.rknn"
    //Content-Type:    application/octet-stream
    //填冲二进制流上传:
    resultForm = curl_formadd(&formpost,&lastptr,
            CURLFORM_COPYNAME,     "file",
            CURLFORM_BUFFER,        file.file_name().c_str(),
            CURLFORM_BUFFERPTR,     file.get_slice_data(sliceIndex),
            CURLFORM_BUFFERLENGTH,  file.get_slice_data_size(sliceIndex),
            CURLFORM_CONTENTTYPE,    "application/octet-stream",
            CURLFORM_END);
    //curl_formadd

    if(resultForm!=CURL_FORMADD_OK){
        printf("curl_formadd faild:%d\n",resultForm);
        return -1;
    }
    p = formpost;
    do{
        printf("%s,%s,%d\n",p->name, p->contents,p->contentslength);
        p = p->next;
    }while(p!=lastptr);

    clear_ws_reault(&_ws_result);
    ret = curlPostFormDataWithBin(file,sliceIndex,_upload_url.c_str(),formpost,&_ws_result);

    if(ret == 0 && strstr(_ws_result.json_data,"\"success\":true,\"code\":10000,")){
        //upload sucess
        ret = 0;
    }else{
        printf("curlPostFormDataWithBin fiald ret:%d,%d\n",ret,_ws_result.curl_res);
    }


    return ret;

}

/*
 *   提交form 表单数据
 *   提交文件二进制片段     
 * return
 *   0 sucess
 *
 */
int WebUploader::curlPostFormDataWithBin(SliceFile& file,int sliceIndex,const char* _url, struct curl_httppost* formpost,CURL_CALL_RESULT* result)
{
    CURLcode res;

    struct curl_slist * _http_headers;
    char *progress_data = (char*)NULL;

    BOOL prevent_cache = TRUE;

    _http_headers = curl_slist_append(_http_headers, "Content-Type: multipart/form-data;");

    curl_easy_setopt(_curlHandle, CURLOPT_SSL_VERIFYHOST, 0);
    curl_easy_setopt(_curlHandle, CURLOPT_SSL_VERIFYPEER, 0L);//忽略证书检查
  

    curl_easy_setopt(_curlHandle, CURLOPT_URL, _url);
    curl_easy_setopt(_curlHandle, CURLOPT_POST, 1L);

    curl_easy_setopt(_curlHandle, CURLOPT_HTTPHEADER, _http_headers);    //设置发送http头部
    curl_easy_setopt(_curlHandle, CURLOPT_HTTPPOST, formpost);

    curl_easy_setopt(_curlHandle, CURLOPT_TIMEOUT, 10L);            //设置超时时间

    //重要!!!多线程下禁用控制域名解析的alarm 超时
    curl_easy_setopt(_curlHandle, CURLOPT_NOSIGNAL, prevent_cache);


    curl_easy_setopt(_curlHandle, CURLOPT_PROGRESSDATA, &file);
    curl_easy_setopt(_curlHandle, CURLOPT_NOPROGRESS, FALSE);
    curl_easy_setopt(_curlHandle, CURLOPT_PROGRESSFUNCTION,WebUploader::web_service_progress_func);

    curl_easy_setopt(_curlHandle, CURLOPT_WRITEDATA, result);
    curl_easy_setopt(_curlHandle, CURLOPT_WRITEFUNCTION,WebUploader::web_service_rsp_write_func);


    curl_easy_setopt(_curlHandle, CURLOPT_VERBOSE, 1L);

    printf("enter curl ws call: curl=%p, ws_result_ptr=%p....\n",
            _curlHandle,
            result);

    //printf( "curl_easy_perform()....\n");
    res = curl_easy_perform(_curlHandle);
    result->curl_res = res;


    return (int)res;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用libcurl库进行POST方法上传文件的步骤如下: 1. 初始化curl库:`curl_global_init(CURL_GLOBAL_ALL);` 2. 创建curl句柄:`CURL* curl = curl_easy_init();` 3. 设置请求URL:`curl_easy_setopt(curl, CURLOPT_URL, url);` 4. 设置请求方式为POST:`curl_easy_setopt(curl, CURLOPT_POST, 1L);` 5. 设置上传文件:`curl_easy_setopt(curl, CURLOPT_READDATA, file);` 其,`file`为你要上传文件文件指针。 6. 设置上传文件大小:`curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, file_size);` 其,`file_size`为你要上传文件的大小。 7. 设置上传文件名:`curl_easy_setopt(curl, CURLOPT_POSTFIELDS, file_name);` 其,`file_name`为你要上传文件文件名。 8. 执行请求:`curl_easy_perform(curl);` 9. 清理curl句柄:`curl_easy_cleanup(curl);` 完整的示例代码如下: ``` #include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; FILE *file; const char *url = "http://example.com/upload.php"; const char *file_name = "example.txt"; long file_size; file = fopen(file_name, "rb"); if (!file) { fprintf(stderr, "Failed to open file '%s'\n", file_name); return 1; } fseek(file, 0L, SEEK_END); file_size = ftell(file); rewind(file); curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_POST, 1L); curl_easy_setopt(curl, CURLOPT_READDATA, file); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, file_size); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, file_name); res = curl_easy_perform(curl); if (res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); curl_easy_cleanup(curl); } fclose(file); curl_global_cleanup(); return 0; } ``` 注意,这只是一个简单的示例,实际应用还需要添加错误处理和其他必要的选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值