私はakka httpを使って簡単なファイルアップロードを実装しようとしています。 次のように私の試みはなりますAkka-HTTP:ファイルアップロード
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"))
}
このコードのいくつかの問題があります。
- が設定されたエンティティのサイズよりも大きいファイルをアップロードすることができません。
Request Content-Length 24090745 exceeds the configured limit of 8388608
- が行に2本のアップロードを実行します
dead letters encountered.
例外が発生します。
サイズの制限を克服する最良の方法は何ですか。また、後でアップロードしたファイルが既存のファイルを上書きするようにファイルを正しく閉じるにはどうすればよいですか?
ありがとうございます。onSuccessを使用すると、「dead letters encountered」問題が解決します。 –
他の問題のアイデアを追加した編集を追加しました – mattinbits
こんにちは、 max-content-lengthを大きな値に設定しても、コンテンツ全体がメモリにバッファされているわけではありません。これはこれを解決する安全な方法です。私はあなたの答えをupvotedだろうが、私は十分なクレジットを持っていない: - ( –