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

相关文章

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.

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

SpringBoot配置Ollama实现本地部署DeepSeek

《SpringBoot配置Ollama实现本地部署DeepSeek》本文主要介绍了在本地环境中使用Ollama配置DeepSeek模型,并在IntelliJIDEA中创建一个Sprin... 目录前言详细步骤一、本地配置DeepSeek二、SpringBoot项目调用本地DeepSeek前言随着人工智能技

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

利用Python实现添加或读取Excel公式

《利用Python实现添加或读取Excel公式》Excel公式是数据处理的核心工具,从简单的加减运算到复杂的逻辑判断,掌握基础语法是高效工作的起点,下面我们就来看看如何使用Python进行Excel公... 目录python Excel 库安装Python 在 Excel 中添加公式/函数Python 读取

Linux文件名修改方法大全

《Linux文件名修改方法大全》在Linux系统中,文件名修改是一个常见且重要的操作,文件名修改可以更好地管理文件和文件夹,使其更具可读性和有序性,本文将介绍三种在Linux系统下常用的文件名修改方法... 目录一、引言二、使用mv命令修改文件名三、使用rename命令修改文件名四、mv命令和rename命

OpenManus本地部署实战亲测有效完全免费(最新推荐)

《OpenManus本地部署实战亲测有效完全免费(最新推荐)》文章介绍了如何在本地部署OpenManus大语言模型,包括环境搭建、LLM编程接口配置和测试步骤,本文给大家讲解的非常详细,感兴趣的朋友一... 目录1.概况2.环境搭建2.1安装miniconda或者anaconda2.2 LLM编程接口配置2