#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?