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

相关文章

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放

java读取excel文件为base64实现方式

《java读取excel文件为base64实现方式》文章介绍使用ApachePOI和EasyExcel处理Excel文件并转换为Base64的方法,强调EasyExcel适合大文件且内存占用低,需注意... 目录使用 Apache POI 读取 Excel 并转换为 Base64使用 EasyExcel 处

Python实现中文大写金额转阿拉伯数字

《Python实现中文大写金额转阿拉伯数字》在财务票据中,中文大写金额被广泛使用以防止篡改,但在数据处理时,我们需要将其转换为阿拉伯数字形式,下面我们就来看看如何使用Python实现这一转换吧... 目录一、核心思路拆解二、中文数字解析实现三、大单位分割策略四、元角分综合处理五、测试验证六、全部代码在财务票

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据