libcurl读取本地文件,文件名带有中文

2024-05-08 17:20

本文主要是介绍libcurl读取本地文件,文件名带有中文,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.路径无中文

std::string respBodyData;
std::string respHeadData;
CURL* curl;
CURLcode res;// 日志记录请求内容
Logger::HttpInfo(constant, "无请求参数");// 设置头
struct curl_slist *headers = NULL;
// 初始化libcurl
curl_global_init(CURL_GLOBAL_ALL);// 创建一个CURL句柄
curl = curl_easy_init();
if (curl == NULL)
{MessageBox(NULL, L"错误的网络连接!", L"错误", MB_ICONERROR);return S_FALSE;
}// 读取请求地址
std::string url;
ReadContantFromFile("addr", url, GetCredentialsFilePath);
FILE *file = fopen(filePath.c_str(), "rb");
if (!file) {MessageBox(NULL, L"文件打开失败,请联系管理员!", L"错误", MB_ICONERROR);return S_FALSE;
}
// 读取文件,由于libcurl不支持unicode格式,采用的ascii编码,因此采用回调函数的形式
size_t pos = filePath.rfind('\\');
std::string fileNameGbk = filePath.substr(pos + 1);
std::string fileNameUtf8;
GbkToUtf8(fileNameGbk, fileNameUtf8);
curl_mime *mime = curl_mime_init(curl);
curl_mimepart *part = curl_mime_addpart(mime);
curl_mime_name(part, "files");
ULONGLONG fileSize = GetFileSize(filePath);
curl_mime_filename(part, filePath.c_str());
curl_mime_filename(part, fileNameUtf8.c_str());
curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);
curl_easy_setopt(curl, CURLOPT_URL, (url + mapping).c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WritePostHeaderResp);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WritePostBodyResp);
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, &respHeadData);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &respBodyData);//  	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 5000); //libcurl存在毫秒超时bug,如果设备小于1000ms立即返回失败
//  	curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 5000); //设置超时时间bool bCA = FALSE;
if (!bCA)
{curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);//设定为不验证证书和HOST curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);
}
else
{curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);curl_easy_setopt(curl, CURLOPT_CAINFO, "");
}res = curl_easy_perform(curl);
fclose(file);
if (res != CURLE_OK)
{MessageBox(NULL, CA2W(curl_easy_strerror(res)), L"错误", MB_ICONEXCLAMATION);return S_FALSE;
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_mime_free(mime);
std::string respBodyDataGbk;
Utf8ToGbk(respBodyData, respBodyDataGbk);
std::string result = respBodyDataGbk.c_str();
// 日志记录返回值
Logger::HttpInfo(constant, respBodyDataGbk, false);// 处理返回值
return ResultHandler(result, data);

2.路径有中文

size_t ReadCallback(char *buffer, size_t size, size_t nitems, void *userdata) {FILE *file = (FILE *)userdata;return fread(buffer, size, nitems, file);;
}
int HttpPost(const std::string constant, const char * mapping, Json::Value & data, BOOL isVerify, const std::string filePath)
{std::string respBodyData;std::string respHeadData;CURL* curl;CURLcode res;// 日志记录请求内容Logger::HttpInfo(constant, "无请求参数");// 设置头struct curl_slist *headers = NULL;// 设置Tokenif (isVerify){// 读取Tokenstd::string token;ReadContantFromFile("token", token, GetCredentialsFilePath);if (token.empty()){MessageBox(NULL, L"当前登录已失效,请重新登录", L"错误", MB_ICONEXCLAMATION);return S_FALSE;}// 设置token请求头headers = curl_slist_append(headers, ("Authorization:" + token).c_str());}// 初始化libcurlcurl_global_init(CURL_GLOBAL_ALL);// 创建一个CURL句柄curl = curl_easy_init();if (curl == NULL){MessageBox(NULL, L"错误的网络连接!", L"错误", MB_ICONERROR);return S_FALSE;}// 读取请求地址std::string url;ReadContantFromFile("addr", url, GetCredentialsFilePath);FILE *file = fopen(filePath.c_str(), "rb");if (!file) {MessageBox(NULL, L"文件打开失败,请联系管理员!", L"错误", MB_ICONERROR);return S_FALSE;}// 读取文件,由于libcurl不支持unicode格式,采用的ascii编码,因此采用回调函数的形式size_t pos = filePath.rfind('\\');std::string fileNameGbk = filePath.substr(pos + 1);std::string fileNameUtf8;GbkToUtf8(fileNameGbk, fileNameUtf8);curl_mime *mime = curl_mime_init(curl);curl_mimepart *part = curl_mime_addpart(mime);curl_mime_name(part, "files");ULONGLONG fileSize = GetFileSize(filePath);curl_mime_data_cb(part, fileSize, ReadCallback	, NULL, NULL, file);curl_mime_filename(part, fileNameUtf8.c_str());curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);curl_easy_setopt(curl, CURLOPT_URL, (url + mapping).c_str());curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WritePostHeaderResp);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WritePostBodyResp);curl_easy_setopt(curl, CURLOPT_WRITEHEADER, &respHeadData);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &respBodyData);//  	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 5000); //libcurl存在毫秒超时bug,如果设备小于1000ms立即返回失败//  	curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 5000); //设置超时时间bool bCA = FALSE;if (!bCA){curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);//设定为不验证证书和HOST curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);}else{curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);curl_easy_setopt(curl, CURLOPT_CAINFO, "");}res = curl_easy_perform(curl);fclose(file);if (res != CURLE_OK){MessageBox(NULL, CA2W(curl_easy_strerror(res)), L"错误", MB_ICONEXCLAMATION);return S_FALSE;}curl_slist_free_all(headers);curl_easy_cleanup(curl);curl_mime_free(mime);std::string respBodyDataGbk;Utf8ToGbk(respBodyData, respBodyDataGbk);std::string result = respBodyDataGbk.c_str();// 日志记录返回值Logger::HttpInfo(constant, respBodyDataGbk, false);// 处理返回值return ResultHandler(result, data);
}

这篇关于libcurl读取本地文件,文件名带有中文的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970946

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

解决Office Word不能切换中文输入

我们在使用WORD的时可能会经常碰到WORD中无法输入中文的情况。因为,虽然我们安装了搜狗输入法,但是到我们在WORD中使用搜狗的输入法的切换中英文的按键的时候会发现根本没有效果,无法将输入法切换成中文的。下面我就介绍一下如何在WORD中把搜狗输入法切换到中文。

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)

ROS1 + Realsense d455 固件安装+读取rostopic数据

目录 安装固件(一定要匹配)ROS1 wrapper 安装方法Realsense SDK 安装方法Realsense Firmware 安装方法 修改roslaunch配置文件,打开双目图像和IMU数据其他坑点参考链接 安装固件(一定要匹配) 如果你是使用ROS1获取realsense数据的话,一定要注意,SDK, Firmware的版本不是越新越好!!,这是因为intel已经不

Python批量读取身份证信息录入系统和重命名

前言 大家好, 如果你对自动化处理身份证图片感兴趣,可以尝试以下操作:从身份证图片中快速提取信息,填入表格并提交到网页系统。如果你无法完成这个任务,我们将在“Python自动化办公2.0”课程中详细讲解实现整个过程。 实现过程概述: 模块与功能: re 模块:用于从 OCR 识别出的文本中提取所需的信息。 日期模块:计算年龄。 pandas:处理和操作表格数据。 PaddleOCR:百度的