当前位置:网站首页>Use libcurl to upload the image of Opencv Mat to the file server, based on two methods of post request and ftp protocol
Use libcurl to upload the image of Opencv Mat to the file server, based on two methods of post request and ftp protocol
2022-08-02 15:27:00 【Hongyao】
基于post请求的
基于postThe method of request is mainly to upload to such as installednginx-upload-module的nginx服务器上,urlThe directory where the parameter passed file is located,底下的curl_formaddadd filename.
不过nginx-upload-modulewill not put the file filename,Instead, save it with the name 00000000xx这样的文件10digit-named files,Prevent upload file conflicts,需要你自己写php或pythonThe script moves the file to the correct location or renames it.
The design seems to make sense(Instead, provide a script for Blue Dog).
size_t writer(char *data, size_t size, size_t nmemb, string *writerData) {
if (writerData == nullptr)
return 0;
size_t len = size * nmemb;
writerData->append(data, len);
return len;
}
void postUpLoad(const cv::Mat &img, const char *url) {
vector<uchar> vec_Img;
vector<int> vecCompression_params;
vecCompression_params.push_back(cv::IMWRITE_JPEG_QUALITY);
vecCompression_params.push_back(90);
imencode(".jpg", img, vec_Img, vecCompression_params);
CURL *curl;
CURLcode res;
string buffer;
struct curl_httppost *post = nullptr;
struct curl_httppost *last = nullptr;
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POST, 1);
struct curl_slist *chunk = nullptr;
chunk = curl_slist_append(chunk, "Accept:");
chunk = curl_slist_append(chunk, "Authorization: Token ");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
curl_formadd(&post, &last,
CURLFORM_COPYNAME, "photo",
CURLFORM_BUFFER, "photo.jpg",
CURLFORM_BUFFERPTR, vec_Img.data(),
CURLFORM_BUFFERLENGTH, vec_Img.size(),
CURLFORM_CONTENTTYPE, "image/jpg",
CURLFORM_END);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
// curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
//
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
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);
}
}
基于ftp协议的
urlPass the file path directly,比如ftp://server.name/subdir/image.jpg
struct TmpStream {
void *ptr;
size_t last_num;
};
static size_t read_callback(void *ptr, size_t size, size_t nmemb, TmpStream *stream) {
if (stream->last_num <= 0)
return 0;
size_t retcode = size * nmemb;
retcode = MIN(retcode, stream->last_num);
memcpy(ptr, stream->ptr, retcode);
stream->last_num -= retcode;
// curl_off_t nread = (curl_off_t) retcode;
// fprintf(stderr, " We read %" CURL_FORMAT_CURL_OFF_T
// " bytes from file\n", nread);
return retcode;
}
void ftpUpload(const cv::Mat &img, const char *url) {
vector<uchar> vec_Img;
vector<int> vecCompression_params;
vecCompression_params.push_back(cv::IMWRITE_JPEG_QUALITY);
vecCompression_params.push_back(90);
imencode(".jpg", img, vec_Img, vecCompression_params);
// struct curl_slist *headerlist = nullptr;
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_USERPWD, "smc:123456");
/* we want to use our own write function */
// curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
/* we want to use our own read function */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
/**create missing dir**/
curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
/* enable uploading */
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
/* specify target */
curl_easy_setopt(curl, CURLOPT_URL, url);
// /* pass in that last of FTP commands to run after the transfer */
// curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
/* now specify which file to upload */
TmpStream stream = {
vec_Img.data(), vec_Img.size()};
curl_easy_setopt(curl, CURLOPT_READDATA, &stream);
/* Set the size of the file to upload (optional). If you give a *_LARGE option you MUST make sure that the type of the passed-in argument is a curl_off_t. If you use CURLOPT_INFILESIZE (without _LARGE) you must make sure that to pass in a type 'long' argument. */
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
(curl_off_t) vec_Img.size());
/* Now run off and do what you have been told! */
res = curl_easy_perform(curl);
/* Check for errors */
if (res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
/* clean up the FTP commands list */
// curl_slist_free_all(headerlist);
/* always cleanup */
curl_easy_cleanup(curl);
}
}
边栏推荐
猜你喜欢

Win10电脑不能读取U盘怎么办?不识别U盘怎么解决?

Win11系统找不到dll文件怎么修复

镜像法求解接地导体空腔电势分布问题

Use tencent cloud builds a personal blog

Win10系统设置application identity自动提示拒绝访问怎么办

FP5139电池与适配器供电DC-DC隔离升降压电路反激电路电荷泵电路原理图

【我的电赛日记(二)】ADF4351锁相环模块

A clean start Windows 7?How to load only the basic service start Windows 7 system

Summarize computer network super comprehensive test questions

Win7怎么干净启动?如何只加载基本服务启动Win7系统
随机推荐
基于无监督医学图像配准论文(1)
FP7195转模拟恒流调光芯片在机器视觉光源的应用优势
The SSE instructions into ARM NEON
Win10系统设置application identity自动提示拒绝访问怎么办
TypeScript 快速进阶
How to update Win11 sound card driver?Win11 sound card driver update method
编译error D8021 :无效的数值参数“/Wextra” cl command line error d8021 invalid numeric argument ‘/wextra‘
LORA芯片ASR6505无线远距离传输8位MCU
系统线性、时不变、因果判断
Bash shell位置参数
Win10上帝模式干嘛的?Win10怎么开启上帝模式?
C语言函数参数传递模式入门详解
FP5139电池与适配器供电DC-DC隔离升降压电路反激电路电荷泵电路原理图
DP4344兼容CS4344-DA转换器
Win10电脑需要安装杀毒软件吗?
MATLAB制作简易小动画入门详解
【我的电赛日记(一)】HMI USART串口屏
2021-10-14
cmake配置libtorch报错Failed to compute shorthash for libnvrtc.so
win10任务栏不合并图标如何设置