diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 8256b4637..eed7bc5f5 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -89,6 +89,10 @@ add_executable(example_session middlewares/example_session.cpp) add_warnings_optimizations(example_session) target_link_libraries(example_session PUBLIC Crow::Crow) +add_executable(example_file_upload example_file_upload.cpp) +add_warnings_optimizations(example_file_upload) +target_link_libraries(example_file_upload PUBLIC Crow::Crow) + if(MSVC) add_executable(example_vs example_vs.cpp) add_warnings_optimizations(example_vs) diff --git a/examples/example_file_upload.cpp b/examples/example_file_upload.cpp new file mode 100644 index 000000000..bf78b0cc0 --- /dev/null +++ b/examples/example_file_upload.cpp @@ -0,0 +1,72 @@ +#include "crow.h" + +int main() +{ + crow::SimpleApp app; + + CROW_ROUTE(app, "/uploadfile") + .methods(crow::HTTPMethod::Post)([](const crow::request& req) { + crow::multipart::message file_message(req); + for (const auto& part : file_message.part_map) + { + const auto& part_name = part.first; + const auto& part_value = part.second; + CROW_LOG_DEBUG << "Part: " << part_name; + if ("InputFile" == part_name) + { + // Extract the file name + auto headers_it = part_value.headers.find("Content-Disposition"); + if (headers_it == part_value.headers.end()) + { + CROW_LOG_ERROR << "No Content-Disposition found"; + return crow::response(400); + } + auto params_it = headers_it->second.params.find("filename"); + if (params_it == headers_it->second.params.end()) + { + CROW_LOG_ERROR << "Part with name \"InputFile\" should have a file"; + return crow::response(400); + } + const std::string outfile_name = params_it->second; + + for (const auto& part_header : part_value.headers) + { + const auto& part_header_name = part_header.first; + const auto& part_header_val = part_header.second; + CROW_LOG_DEBUG << "Header: " << part_header_name << '=' << part_header_val.value; + for (const auto& param : part_header_val.params) + { + const auto& param_key = param.first; + const auto& param_val = param.second; + CROW_LOG_DEBUG << " Param: " << param_key << ',' << param_val; + } + } + + // Create a new file with the extracted file name and write file contents to it + std::ofstream out_file(outfile_name); + if (!out_file) + { + CROW_LOG_ERROR << " Write to file failed\n"; + continue; + } + out_file << part_value.body; + out_file.close(); + CROW_LOG_INFO << " Contents written to " << outfile_name << '\n'; + } + else + { + CROW_LOG_DEBUG << " Value: " << part_value.body << '\n'; + } + } + return crow::response(200); + }); + + // enables all log + app.loglevel(crow::LogLevel::Debug); + + app.port(18080) + .multithreaded() + .run(); + + return 0; +}