当前位置:网站首页>使用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);
}
}
边栏推荐
猜你喜欢
随机推荐
win11一直弹出用户账户控制怎么解决
Pytorch(16)---搭建一个完整的模型
Win7怎么干净启动?如何只加载基本服务启动Win7系统
Win10无法连接打印机怎么办?不能使用打印机的解决方法
Detailed explanation of RecyclerView series article directory
LeetCode2 电话号码的字母组合
Please make sure you have the correct access rights and the repository exists.问题解决
利用红外-可见光图像数据集OTCBVS打通图像融合、目标检测和目标跟踪
PyTorch⑥---卷积神经网络_池化层
【我的电赛日记(三)】STM32学习笔记与要点总结
FP7122降压恒流内置MOS耐压100V共正极阳极PWM调光方案原理图
PyTorch⑨---卷积神经网络_线性层
FP7126降压恒流65536级高辉无频闪调光共阳极舞台灯RGB驱动方案
NER(命名体识别)之 FLAT模型
Binder机制(下篇)
神经网络的设计过程
Letter combination of LeetCode2 phone number
2021-10-14
Win10电脑不能读取U盘怎么办?不识别U盘怎么解决?
为android系统添加产品的过程