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

相关文章

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

Maven如何手动安装依赖到本地仓库

《Maven如何手动安装依赖到本地仓库》:本文主要介绍Maven如何手动安装依赖到本地仓库问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、下载依赖二、安装 JAR 文件到本地仓库三、验证安装四、在项目中使用该依赖1、注意事项2、额外提示总结一、下载依赖登

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.