[C++]使用cpphttplib的http服务上传和下载

[复制链接]
发表于 2025-12-31 06:12:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
上传(这里指的是客户端向服务端上传文件,编写的服务端的代码)

  1. void onUpload(const httplib::Request &req, httplib::Response &res, const httplib::ContentReader &content_reader)
  2. {
  3.    
  4.    
  5.     if(req.is_multipart_form_data()){
  6.    
  7.    
  8.         httplib::MultipartFormDataItems files;
  9.         content_reader([&](const httplib::MultipartFormData &file){
  10.    
  11.    
  12.                 files.push_back(file);
  13.                 return true;
  14.         },
  15.         [&](const char *data, size_t data_length){
  16.    
  17.    
  18.                            files.back().content.append(data, data_length);
  19.                 return true;
  20.         });
  21.         for(const auto& file : files){
  22.    
  23.    
  24.             if(file.filename.empty()){
  25.    
  26.    
  27.                 std::cout << file.name << " : " << file.content << std::endl;
  28.             }else{
  29.    
  30.    
  31.                 //C++ windows下utf-8转gbk
  32.                 char* ansiStr = utf8_2_ansi(file.filename.c_str(), nullptr);
  33.                 std::string fileName(ansiStr);
  34.                 free(ansiStr);
  35.                 ansiStr = nullptr;
  36.                 std::ofstream ofs("./" + fileName, std::ofstream::trunc | std::ostream::binary);
  37.                 if(ofs.is_open()){
  38.    
  39.    
  40.                     ofs.write(file.content.c_str(), file.content.size());
  41.                     ofs.close();
  42.                 }
  43.             }
  44.         }
  45.     }else{
  46.    
  47.    
  48.         //这里好像并没有一个通用的请求头来标识上传文件的文件名,但是可以服务端和客户端约定一个请求头来标识上传的文件名
  49.         std::string fileName = req.get_header_value("fileName");
  50.         //C++ Windows环境下utf8转换gbk编码,才能正确打开文件
  51.         char* ansiStr = utf8_2_ansi(fileName.c_str(), nullptr);
  52.         fileName.assign(ansiStr);
  53.         free(ansiStr);
  54.         ansiStr = NULL;
  55.         std::ofstream ofs("./" + fileName
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表