测试环境
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;
}
编译运行测试
# 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