qq_45686724 2024-04-10 17:41 采纳率: 25%
浏览 3
已结题

C++ boost接收文件 保存失败

请问C++ 使用boost实现http服务端时,在接收form-data中的文件并保存在本地时,图片文件和mp4文件都不能打开,其他的文件都可以正常打开


auto& body = this->request_.body();
            auto body_str = boost::beast::buffers_to_string(body.data());

            std::cerr << "开始 "  << '\n';
            // 解析请求并查找文件内容
            std::string request_str = body_str;
            std::size_t start = request_str.find("Content-Disposition: form-data; name=\"file\"; filename=");

            std::cerr << "解析文件 开始 " << '\n';

            if (start != std::string::npos) {
                start += strlen("Content-Disposition: form-data; name=\"file\"; filename=");
                std::size_t end = request_str.find("\r\n", start);
                std::string filename = request_str.substr(start, end - start);
                start = request_str.find("\r\n\r\n", end + 2);
                if (start != std::string::npos) {
                    end = request_str.find("\r\n--", start);
                    if (end != std::string::npos) {
                        //去除读取到文件的前两行
                        std::string file_data = request_str.substr(start, end - start );
                        // 现在你有了文件数据,可以写入磁盘或其他操作
                        std::cout << "---------------------" << std::endl;
                        //std::cout << file_data << std::endl;
                        //std::cout << "---------------------" << std::endl;
                        //std::cout << body_str << std::endl;
                        std::cout << "---------------------" << std::endl;
                        std::string path;
                        std::string path1 = "E:\\APK\\" + filename.substr(1, filename.find_last_of("\"")-1);
                        path = "mkdir \"" + path1 + "\"";
                        //system(path.c_str());

                        std::ofstream file(path1, std::ios::binary);
                        //if (file.is_open()) {
                            file << file_data;
                            file.close();
                        //}
                        //else {
                            std::cerr << "Failed to open file: " << filename << '\n';
                            std::cerr << "path1: " << path1 << '\n';
                        //}
                    }
                }

            }
  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-10 17:42
    关注

    引自免费微信小程序:皆我百晓生

    非常抱歉,由于您未提供具体的问题背景,因此我将为您提供一个通用的解决方案。

    首先,我们需要确定上传文件的具体格式。假设您的服务器支持MP4和PNG格式,并且可以识别它们。这可以通过在boost::beast::buffers_to_string()函数中添加额外的参数来实现。

    以下是一个简单的例子,展示如何将JSON格式的数据转换为字节数组:

    #include <iostream>
    #include <fstream>
    #include <sstream>
    
    // 将JSON字符串转换为字节数组
    std::vector<char> jsonToBytes(const std::string &json_str)
    {
        std::istringstream iss(json_str);
        std::vector<char> bytes;
        std::string token;
    
        while (iss >> token) {
            bytes.push_back(token.begin());
        }
    
        return bytes;
    }
    

    然后,我们可以使用这个方法来读取文件内容。例如,如果您正在使用Boost,您可以这样创建一个std::ifstream对象来打开文件:

    #include <boost/filesystem.hpp>
    #include <fstream>
    
    std::ifstream file(std::string path)
    {
        try {
            file.open(path);
            return file;
        } catch (std::exception &e) {
            std::cerr << "Failed to open file: " << e.what() << '\n';
            return false;
        }
    }
    

    接下来,我们处理解析错误。根据错误信息,我们可以查看具体的异常原因,并相应地调整代码。

    最后,当您尝试将文件保存到本地时,可以在std::ofstream对象的构造函数中指定文件路径和模式:

    #include <boost/filesystem.hpp>
    #include <fstream>
    
    std::ofstream file(std::string path, std::ios::binary | std::ios::ate)
    {
        try {
            file.open(path);
            return file;
        } catch (std::exception &e) {
            std::cerr << "Failed to open file: " << e.what() << '\n';
            return false;
        }
    }
    

    注意:以上示例仅用于指导,具体实现可能因您的实际需求而异。例如,您可能需要从用户那里获取输入,或者对文件进行更复杂的处理。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月16日
  • 创建了问题 4月10日

悬赏问题

  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数