# Upload File

# Upload and stream to file


#include "oatpp/core/data/stream/FileStream.hpp"

...

ENDPOINT("POST", "/upload", upload, REQUEST(std::shared_ptr<IncomingRequest>, request)) {
    oatpp::data::stream::FileOutputStream fileOutputStream("/path/to/file");
    request->transferBodyToStream(&fileOutputStream); // transfer body chunk by chunk
    return createResponse(Status::CODE_200, "OK");
}

# Simple API Multipart Upload

# Store Part In Memory


  #include "oatpp/web/mime/multipart/InMemoryPartReader.hpp"
  #include "oatpp/web/mime/multipart/Reader.hpp"
  #include "oatpp/web/mime/multipart/PartList.hpp"
  
  ...
  
  namespace multipart = oatpp::web::mime::multipart;
  
  ...

ENDPOINT("POST", "upload/multipart", uploadMultipart,
    REQUEST(std::shared_ptr<IncomingRequest>, request))
{

    /* Prepare multipart container. */
    auto multipart = std::make_shared<multipart::PartList>(request->getHeaders());

    /* Create multipart reader. */
    multipart::Reader multipartReader(multipart.get());

    /* Configure to read part with name "part1" into memory */
    multipartReader.setPartReader("part1", multipart::createInMemoryPartReader(256 /* max-data-size */));

    /* Read multipart body */
    request->transferBody(&multipartReader);

    /* Print value of "part1" */
    auto part1 = multipart->getNamedPart("part1");

    /* Assert part is not null */
    OATPP_ASSERT_HTTP(part1, Status::CODE_400, "part1 is null");

    /* Print part value */
    OATPP_LOGD("Multipart", "part1='%s'", part1->getInMemoryData()->c_str());

    return createResponse(Status::CODE_200, "OK");

}

# Stream Part To File


  #include "oatpp/web/mime/multipart/FileStreamProvider.hpp"
  #include "oatpp/web/mime/multipart/Reader.hpp"
  #include "oatpp/web/mime/multipart/PartList.hpp"

  
  ...
  
  namespace multipart = oatpp::web::mime::multipart;
  
  ...

  ENDPOINT("POST", "upload/multipart", uploadMultipart,
           REQUEST(std::shared_ptr<IncomingRequest>, request))
  {

    /* Prepare multipart container. */
    auto multipart = std::make_shared<multipart::PartList>(request->getHeaders());

    /* Create multipart reader. */
    multipart::Reader multipartReader(multipart.get());

    /* Configure to stream part with name "part1" to file */
    multipartReader.setPartReader("part1", multipart::createFilePartReader("/path/to/file"));

    /* Read multipart body */
    request->transferBody(&multipartReader);

    /* Print value of "part1" */
    auto part1 = multipart->getNamedPart("part1");

    /* Assert part is not null */
    OATPP_ASSERT_HTTP(part1, Status::CODE_400, "part1 is null");

    /* Get part data input stream */
    auto inputStream = part1->getInputStream();
    
    // TODO - process file stream.

    return createResponse(Status::CODE_200, "OK");

  }

# Complete Example


  #include "oatpp/web/mime/multipart/FileStreamProvider.hpp"
  #include "oatpp/web/mime/multipart/InMemoryPartReader.hpp"
  #include "oatpp/web/mime/multipart/Reader.hpp"
  #include "oatpp/web/mime/multipart/PartList.hpp"

  ...
  
  namespace multipart = oatpp::web::mime::multipart;
  
  ...

  ENDPOINT("POST", "test/multipart-all", uploadMultipart,
           REQUEST(std::shared_ptr<IncomingRequest>, request))
  {

    /* Prepare multipart container. */
    auto multipart = std::make_shared<multipart::PartList>(request->getHeaders());

    /* Create multipart reader. */
    multipart::Reader multipartReader(multipart.get());

    /* Configure to read part with name "part1" into memory */
    multipartReader.setPartReader("part1", multipart::createInMemoryPartReader(256 /* max-data-size */));

    /* Configure to stream part with name "part2" to file */
    multipartReader.setPartReader("part2", multipart::createFilePartReader("/path/to/file"));

    /* Configure to read all other parts into memory */
    multipartReader.setDefaultPartReader(multipart::createInMemoryPartReader(16 * 1024 /* max-data-size */));

    /* Read multipart body */
    request->transferBody(&multipartReader);

    /* Print number of uploaded parts */
    OATPP_LOGD("Multipart", "parts_count=%d", multipart->count());

    /* Get part by name "part1" */
    auto part1 = multipart->getNamedPart("part1");

    /* Assert part is not null */
    OATPP_ASSERT_HTTP(part1, Status::CODE_400, "part1 is null");

    /* Print in-memory value of "part1" */
    OATPP_LOGD("Multipart", "part1='%s'", part1->getInMemoryData()->c_str());

    /* Get part by name "part2"*/
    auto filePart = multipart->getNamedPart("part2");

    /* Assert part is not null */
    OATPP_ASSERT_HTTP(filePart, Status::CODE_400, "part2 is null");

    /* Get part data input stream */
    auto inputStream = filePart->getInputStream();

    // TODO - process file stream.

    return createResponse(Status::CODE_200, "OK");

  }

# Async API Multipart Upload

# Async Store Part In Memory

  #include "oatpp/web/mime/multipart/InMemoryPartReader.hpp"
  #include "oatpp/web/mime/multipart/Reader.hpp"
  
  ...
  
  namespace multipart = oatpp::web::mime::multipart;
  
  ...

  ENDPOINT_ASYNC("POST", "test/multipart-all", MultipartUpload) {

    ENDPOINT_ASYNC_INIT(MultipartUpload)

    /* Coroutine State */
    std::shared_ptr<multipart::Multipart> m_multipart;

    Action act() override {

      m_multipart = std::make_shared<multipart::Multipart>(request->getHeaders());
      auto multipartReader = std::make_shared<multipart::AsyncReader>(m_multipart);

      /* Configure to read part with name "part1" into memory */
      multipartReader->setPartReader("part1", multipart::createAsyncInMemoryPartReader(256 /* max-data-size */));

      /* Read multipart body */
      return request->transferBodyAsync(multipartReader).next(yieldTo(&MultipartUpload::onUploaded));

    }

    Action onUploaded() {

      /* Get multipart by name */
      auto part1 = m_multipart->getNamedPart("part1");

      /* Asser part not-null */
      OATPP_ASSERT_HTTP(part1, Status::CODE_400, "part1 is null");

      /* Print value of "part1" */
      OATPP_LOGD("Multipart", "part1='%s'", part1->getInMemoryData()->c_str());

      return _return(controller->createResponse(Status::CODE_200, "OK"));

    }

  };

# Async Stream Part To File

  #include "oatpp/web/mime/multipart/FileStreamProvider.hpp"
  #include "oatpp/web/mime/multipart/Reader.hpp"
  
  ...
  
  namespace multipart = oatpp::web::mime::multipart;
  
  ...

  ENDPOINT_ASYNC("POST", "test/multipart-all", MultipartUpload) {

    ENDPOINT_ASYNC_INIT(MultipartUpload)

    /* Coroutine State */
    std::shared_ptr<multipart::Multipart> m_multipart;

    Action act() override {

      m_multipart = std::make_shared<multipart::Multipart>(request->getHeaders());
      auto multipartReader = std::make_shared<multipart::AsyncReader>(m_multipart);

      /* Configure to stream part with name "part1" to file */
      multipartReader->setPartReader("part1", multipart::createAsyncFilePartReader("/path/to/file"));

      /* Read multipart body */
      return request->transferBodyAsync(multipartReader).next(yieldTo(&MultipartUpload::onUploaded));

    }

    Action onUploaded() {

      /* Get multipart by name */
      auto filePart = m_multipart->getNamedPart("part1");

      /* Asser part not-null */
      OATPP_ASSERT_HTTP(filePart, Status::CODE_400, "part1 is null");

      /* Get part data input stream */
      auto inputStream = filePart->getInputStream();

      // TODO - process file stream.

      return _return(controller->createResponse(Status::CODE_200, "OK"));

    }

  };

# Async Complete Example

  #include "oatpp/web/mime/multipart/FileStreamProvider.hpp"
  #include "oatpp/web/mime/multipart/InMemoryPartReader.hpp"
  #include "oatpp/web/mime/multipart/Reader.hpp"
  
  ...
  
  namespace multipart = oatpp::web::mime::multipart;
  
  ...

  ENDPOINT_ASYNC("POST", "test/multipart-all", MultipartUpload) {

    ENDPOINT_ASYNC_INIT(MultipartUpload)

    /* Coroutine State */
    std::shared_ptr<multipart::Multipart> m_multipart;

    Action act() override {

      m_multipart = std::make_shared<multipart::Multipart>(request->getHeaders());
      auto multipartReader = std::make_shared<multipart::AsyncReader>(m_multipart);

      /* Configure to read part with name "part1" into memory */
      multipartReader->setPartReader("part1", multipart::createAsyncInMemoryPartReader(256 /* max-data-size */));

      /* Configure to stream part with name "part2" to file */
      multipartReader->setPartReader("part2", multipart::createAsyncFilePartReader("/path/to/file"));

      /* Configure to read all other parts into memory */
      multipartReader->setDefaultPartReader(multipart::createAsyncInMemoryPartReader(16 * 1024 /* max-data-size */));

      /* Read multipart body */
      return request->transferBodyAsync(multipartReader).next(yieldTo(&MultipartUpload::onUploaded));

    }

    Action onUploaded() {

      /* Print number of uploaded parts */
      OATPP_LOGD("Multipart", "parts_count=%d", m_multipart->count());

      /* Get multipart by name */
      auto part1 = m_multipart->getNamedPart("part1");

      /* Asser part not-null */
      OATPP_ASSERT_HTTP(part1, Status::CODE_400, "part1 is null");

      /* Print value of "part1" */
      OATPP_LOGD("Multipart", "part1='%s'", part1->getInMemoryData()->c_str());

      /* Get multipart by name */
      auto filePart = m_multipart->getNamedPart("part2");

      /* Asser part not-null */
      OATPP_ASSERT_HTTP(filePart, Status::CODE_400, "part2 is null");

      /* Get part data input stream */
      auto inputStream = filePart->getInputStream();

      // TODO - process file stream.

      return _return(controller->createResponse(Status::CODE_200, "OK"));

    }

  };