当前位置:网站首页>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);
}
}
边栏推荐
- In-depth understanding of Golang's Map
- 日常-笔记
- 神经网络的设计过程
- FP7195大功率零压差全程无频闪调光DC-DC恒流芯片(兼容调光器:PWM调光,无极调光,0/1-10V调光)
- Configure clangd for vscode
- define #使用
- A clean start Windows 7?How to load only the basic service start Windows 7 system
- 7. How to add the Click to RecyclerView and LongClick events
- 机器学习和深度学习中的梯度下降及其类型
- FP7128内置MOS降压恒流调光深度0.01%高辉共阳调光方案
猜你喜欢

yolov5官方代码解读——前向传播

Summarize computer network super comprehensive test questions

Mapreduce环境详细搭建和案例实现

PHY6222蓝牙5.2支持MESH组网M0内核超低功耗

Win10 cannot directly use photo viewer to open the picture

13.56MHZ刷卡芯片CI521兼容cv520/ci520支持A卡B卡MIFARE协议

推开机电的大门《电路》(二):功率计算与判断

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

cmake配置libtorch报错Failed to compute shorthash for libnvrtc.so

How to reinstall Win7 system with U disk?How to reinstall win7 using u disk?
随机推荐
使用npx -p @storybook/cli sb init安装失败,手把手搭建专属的storybook
How to update Win11 sound card driver?Win11 sound card driver update method
【我的电赛日记(三)】STM32学习笔记与要点总结
利用plot_surface命令绘制复杂曲面入门详解
LeetCode2 电话号码的字母组合
Win10安装了固态硬盘还是有明显卡顿怎么办?
FP6195耐压60V电流降压3.3V5V模块供电方案
单端K总线收发器DP9637兼容L9637
pytorch模型转libtorch和onnx格式的通用代码
图像配置分类及名词解释
win10无法直接用照片查看器打开图片怎么办
Win11 keeps popping up User Account Control how to fix it
推开机电的大门《电路》(二):功率计算与判断
Win11声卡驱动如何更新?Win11声卡驱动更新方法
Win7遇到错误无法正常开机进桌面怎么解决?
The overlapping effect of the two surfaceviews is similar to the video and handout practice in the live effect
What should I do if the Win10 system sets the application identity to automatically prompt for access denied?
casbin模型
小T成长记-网络篇-1-什么是网络?
FP5207电池升压 5V9V12V24V36V42V大功率方案