2015-10-03 29 views
6

akka http kullanarak basit bir dosya yüklemeyi uygulamaya çalışıyorum. şöyle girişimim görünür: yüklenemezAkka-HTTP: Dosya Yükleme

  1. Dosyalar yapılandırılmış varlık boyutundan daha büyük: Request Content-Length 24090745 exceeds the configured limit of 8388608
  2. üste iki yüklemeleri yürütülmesi

    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")) 
    
        } 
    

    bu kodla çeşitli faktörler vardır dead letters encountered. istisnasıyla sonuçlanır.

Boyut sınırlamalarının üstesinden gelmenin en iyi yolu nedir ve dosyayı daha sonra nasıl yükleyeceğim, böylece varolan dosyanın üzerine yazılacak (eşzamanlı yüklemeler yok sayılacak)?

cevap

8

2. nokta için, source.to(sink).run() işleminin senkronize olmayan bir şekilde çalıştırıldığını düşünüyorum. Future maddesini oluşturur. Bu nedenle, HTTP isteğiniz dosya yazımı tamamlanmadan önce geri dönebilir, bu nedenle ilk istek döndüğü anda istemciye ikinci bir yükleme başlatırsanız, ilk dosyaya yazmayı bitirmemiş olabilir. Gelecekteki tamamlandığında

Yalnızca http isteği tamamlamak için onComplete veya onSuccess yönergesini kullanabilirsiniz:

http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0-M2/scala/http/directives/alphabetically.html

http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0/scala/http/routing-dsl/directives/future-directives/onSuccess.html

DÜZENLEME: İçerik uzunluğu sorun için

, bir Yapabileceğiniz şey, o mülkün boyutunu application.conf içinde artırmaktır. Varsayılan konum:

  1. İşte

onSuccess bir parçacık İşte Kullanılması akka.server.parsing.max-content-length

  • artırılması:

    akka.server.parsing.max-content-length = 8m 
    

    mattinbits yorumlarınızı, following çözüm çalışır özetleme http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0/java/http/configuration.html

  • +0

    Teşekkürler, onSuccess kullanarak karşılaşılan 'ölü harfler' sorununu çözer. –

    +0

    Diğer bir sorun hakkında bir fikir eklediniz. – mattinbits

    +0

    Merhaba, Teşekkürler, Maksimum içerik uzunluğunu daha büyük bir değere ayarlamanın tüm içeriğin belleğe alındığı anlamına gelmediğini öğrendim. Bu, bunu çözmek için güvenli bir yoldur. Cevabını bastırabilirdim ama yeterli kredim yok :-( –

    5

    Bkz Kod: