当前位置:网站首页>使用libcurl将Opencv Mat的图像上传到文件服务器,基于post请求和ftp协议两种方法
使用libcurl将Opencv Mat的图像上传到文件服务器,基于post请求和ftp协议两种方法
2022-08-02 14:09:00 【虹夭】
基于post请求的
基于post请求的方法主要是上传到比如装了nginx-upload-module的nginx服务器上,url参数传文件所在目录,底下的curl_formadd里添加文件名。
不过nginx-upload-module不会把文件文件名,而是保存成名字为00000000xx
这样的文件10位数字命名的文件,防止上传文件冲突,需要你自己写php或python脚本把文件搬运到正确的位置或者重命名。
设计的好像挺有道理的(倒是给蓝狗提供个脚本呗)。
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协议的
url直接传文件路径,比如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);
}
}
边栏推荐
猜你喜欢
Bert系列之 Transformer详解
语言模型(NNLM)
镜像法求解接地导体空腔电势分布问题
How to add a one-key shutdown option to the right-click menu in Windows 11
FP7122降压恒流内置MOS耐压100V共正极阳极PWM调光方案原理图
【我的电赛日记(三)】STM32学习笔记与要点总结
PyTorch⑤---卷积神经网络_卷积层
深度学习之文本分类总结
The problem that UIWindow's makeKeyAndVisible does not call viewDidLoad of rootviewController
Win10电脑不能读取U盘怎么办?不识别U盘怎么解决?
随机推荐
Win7 encounters an error and cannot boot into the desktop normally, how to solve it?
Letter combination of LeetCode2 phone number
CS4398音频解码替代芯片DP4398完全兼容DAC解码
【系统设计与实现】基于flink的分心驾驶预测与数据分析系统
【我的电赛日记(一)】HMI USART串口屏
【使用Pytorch实现VGG16网络模型】
LORA芯片ASR6505无线远距离传输8位MCU
DP1332E刷卡芯片支持NFC内置mcu智能楼宇/终端poss机/智能门锁
文本匹配任务
FP7195转模拟调光技术解决智能家居调光频闪和电感噪音的原理
【使用Pytorch实现ResNet网络模型:ResNet50、ResNet101和ResNet152】
7. How to add the Click to RecyclerView and LongClick events
Tensorflow张量生成
内存申请(malloc)和释放(free)之上篇
STL容器自定义内存分配器
PyTorch⑩---卷积神经网络_一个小的神经网络搭建
让深度学习歇一会吧
2.4G无线小模块CI24R1超低成本
PyTorch⑤---卷积神经网络_卷积层
Win11电脑一段时间不操作就断网怎么解决