使用curl api发送二进制图片

测试环境

    java与golang开发的http server

具体需求

    直接以图片二进制的形式上传到服务器,转化base64太大,浪费带宽和时间

使用curl api具体代码

#include <iostream>
#include <curl/curl.h>
#include <string>
#include <iostream>
#include <sstream>

// #define USEMIME

using namespace std;

void help(char *argv[]){
  std::cout << "please input arguments like:" << argv[0] << " abc.png" << std::endl;
}

size_t proccess_callback(void *ptr, size_t size, size_t nmemb, void *stream) 
{
  cout << "size:" << size << endl;
  string data((const char*) ptr, (size_t) size * nmemb);
  *((stringstream*) stream) << data << endl;
  return size * nmemb;
}

//curl -H "Content-Type:jpg" --data-binary @image6.png "http://192.168.1.30:9800/v2/query"
int main(int argc, char* argv[])
{
  string url = "http://192.168.1.30:9800/v2/query";
  if(argc == 1){
    help(argv);
    return -1;
  }else if(argc == 3){
    url = argv[2];
  }
  CURL *curl;
  CURLcode res;
  std::stringstream out;
  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "http");

    //接收返回结果
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, proccess_callback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &out);

    curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0"); 
    
    struct curl_slist *headers = NULL;
    headers = curl_slist_append(headers, "cache-control:no-cache");
    headers = curl_slist_append(headers, "Content-Type:jpg");
    headers = curl_slist_append(headers, "Token:d9bc6659bc783d4c39691611628b8ca2");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

#ifdef USEMIME
    curl_mime *mime;
    curl_mimepart *part;
    mime = curl_mime_init(curl);
    part = curl_mime_addpart(mime);
    curl_mime_name(part, "file");
    curl_mime_filedata(part, argv[1]);
    part = curl_mime_addpart(mime);
    curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);
#else
    FILE *fp = fopen(argv[1], "rb");
    fseek(fp, 0, SEEK_END);
    int bflen = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    void* fileMem = malloc(bflen);
    fread(fileMem, 1, bflen, fp);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, fileMem); 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, bflen); 
#endif
    res = curl_easy_perform(curl);

#ifdef USEMIME
    curl_mime_free(mime);
    cout << "result code:" << res << " request:" << argv[1] << " result:" << out.str().c_str() << endl;
#else
    cout << "result code:" << res << " request:" << argv[1] << " len:" << bflen  << " result:" << out.str().c_str() << endl;
    fclose(fp);
#endif
  
    
  }
  curl_easy_cleanup(curl);
  return 0;
}

编译运行测试

  • CMakeLists.txt,文件内容
    # version
    cmake_minimum_required(VERSION 3.11)

    # project clt
    project(curlctl VERSION 0.1.1)

    # curl
    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/curl)

    # exec srouces
    file(GLOB EXEC_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/main.cc)

    # make binary
    add_executable(${PROJECT_NAME} ${EXEC_SRCS})

    # link
    target_link_libraries(${PROJECT_NAME} PRIVATE libcurl)
  • 编译测试
    cmake -Bbuild_ninja .
    cmake --build build_ninja
    build_ninja/curlctl ./demo.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

telllong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值