storeUploadedFile

Signature

def storeUploadedFile(fieldName: String, destFn: FileInfo => File): Directive[(FileInfo, File)]

Description

Streams the contents of a file uploaded as a multipart form into a file on disk and provides the file and metadata about the upload.

If there is an error writing to disk the request will be failed with the thrown exception. If there is no field with the given name the request will be rejected. If there are multiple file parts with the same name, the first one will be used and the subsequent ones ignored.

Note

This directive will stream contents of the request into a file, however one can not start processing these until the file has been written completely. For streaming APIs it is preferred to use the fileUpload directive, as it allows for streaming handling of the incoming data bytes.

Example

Scala
source
def tempDestination(fileInfo: FileInfo): File = Files.createTempFile(fileInfo.fileName, ".tmp").toFile val route = storeUploadedFile("csv", tempDestination) { case (metadata, file) => // do something with the file and file metadata ... file.delete() complete(StatusCodes.OK) } // tests: val multipartForm = Multipart.FormData( Multipart.FormData.BodyPart.Strict( "csv", HttpEntity(ContentTypes.`text/plain(UTF-8)`, "2,3,5\n7,11,13,17,23\n29,31,37\n"), Map("filename" -> "primes.csv"))) Post("/", multipartForm) ~> route ~> check { status shouldEqual StatusCodes.OK }
Java
sourceimport static akka.http.javadsl.server.Directives.complete;
import static akka.http.javadsl.server.Directives.storeUploadedFile;

    final Function<FileInfo, File> temporaryDestination = (info) -> {
      try {
        return Files.createTempFile(info.getFileName(), ".tmp").toFile();
      } catch (Exception e) {
        return null;
      }
    };

    final Route route = storeUploadedFile("csv", temporaryDestination, (info, file) -> {
      // do something with the file and file metadata ...
      file.delete();
      return complete(StatusCodes.OK);
    });

    Map<String, String> filenameMapping = new HashMap<>();
    filenameMapping.put("filename", "primes.csv");

    akka.http.javadsl.model.Multipart.FormData multipartForm =
      Multiparts.createStrictFormDataFromParts(Multiparts.createFormDataBodyPartStrict("csv",
        HttpEntities.create(ContentTypes.TEXT_PLAIN_UTF8,
          "2,3,5\n7,11,13,17,23\n29,31,37\n"), filenameMapping));

    // test:
    testRoute(route).run(HttpRequest.POST("/")
      .withEntity(
        multipartForm.toEntity(BodyPartRenderer
		  .randomBoundaryWithDefaults())))
      .assertStatusCode(StatusCodes.OK);
Found an error in this documentation? The source code for this page can be found here. Please feel free to edit and contribute a pull request.