I am trying to implement a simple file upload using akka http. My attempt is as follows:
import akka.actor.ActorSystem import akka.event.{LoggingAdapter, Logging} import akka.http.scaladsl.Http import akka.http.scaladsl.model.{HttpResponse, HttpRequest} import akka.http.scaladsl.model.StatusCodes._ import akka.http.scaladsl.server.Directives._ import akka.stream.{ActorMaterializer, Materializer} import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import scala.concurrent.{ExecutionContextExecutor, Future} import akka.http.scaladsl.model.StatusCodes import akka.http.scaladsl.model.HttpEntity import java.io._ import akka.stream.io._ object UploadTest extends App { implicit val system = ActorSystem() implicit val executor = system.dispatcher implicit val materializer = ActorMaterializer() val config = ConfigFactory.load() val logger = Logging(system, getClass) val routes = { pathSingleSlash { (post & extractRequest) { request => { val source = request.entity.dataBytes val outFile = new File("/tmp/outfile.dat") val sink = SynchronousFileSink.create(outFile) source.to(sink).run() complete(HttpResponse(status = StatusCodes.OK)) } } } } Http().bindAndHandle(routes, config.getString("http.interface"), config.getInt("http.port")) }
There are several problems with this code:
- Files larger than the configured object size cannot be loaded:
Request Content-Length 24090745 exceeds the configured limit of 8388608 - Performing two downloads per line
dead letters encountered. exception dead letters encountered. .
What is the best way to overcome size limits and how can I close a file so that subsequent download overwrites the existing file (ignoring the simultaneous download at the moment)?
source share