C CppRest : Чтение файла из http_request (данные составной формы)

#c #file #stream #cpprest-sdk

Вопрос:

Я отправляю аудиофайл в свой API с поддержкой cpprest и хочу скопировать этот файл в локальный каталог на сервере. Однако у меня возникли проблемы с фактическим получением файла из http_request. Я попробовал два разных подхода, которые я опишу ниже.

Подход № 1:

 auto fileBuffer =
        std::make_shared<Concurrency::streams::basic_ostream<uint8_t>>();
    try
    {
        auto stream = concurrency::streams::fstream::open_ostream(
            U("uploaded.wav"),
            std::ios_base::out | std::ios_base::binary).then([message, fileBuffer](pplx::task<Concurrency::streams::basic_ostream<unsigned char>> Previous_task)
        {

            *fileBuffer = Previous_task.get();
            try
            {
                message.body().read_to_end(fileBuffer->streambuf()).get();
            }
            catch (const exceptionamp;)
            {
                wcout << L"<exception>" << std::endl;
            }

        }).then([=](pplx::task<void> Previous_task)
        {
            fileBuffer->close();
        });
    }
    catch (const exceptionamp; e)
    {
        wcout << e.what() << endl;
    }
 

Это приводит к повреждению файла, который не будет воспроизводиться, но когда я открываю его в блокноте, я вижу следующее в верхней части файла:

 ------WebKitFormBoundaryHdPc63BmFUcMXB3x
Content-Disposition: form-data; name="uploadFile"; filename="preamble.wav"
Content-Type: audio/wav
 

Если я удалю этот раздел, он будет воспроизводиться-значит, файл копируется, я просто добавляю дополнительный текст из тела в верхней части файла. Основываясь на этой информации, я попытался скопировать строку за строкой, чтобы удалить мусор, следующим образом:

Подход № 2:

 ofstream outfile;
    const auto data = message.content_ready().get().extract_vector().get();
    std::string body = { data.begin(), data.end() };
    std::istringstream iss(body);
    bool startCopying = false;
    
    std::string line;
    while (std::getline(iss, line)) {
        if (startCopying) {
            outfile << line;
        }
        else if (line == "r") {
            startCopying = true;
            outfile.open("test.wav");
        }
    }
    outfile.close();
 

Это также приводит к повреждению файла; на этот раз файл воспроизводится, но звук заменяется равным количеством статики.

Итак, как обычно извлекается нужный файл из тела http_request?