2017-10-31 10 views
2

업로드 된 파일을 수신하기 위해 작은 Akka HTTP 서버를 만들었습니다.Akka HTTP 서버가 다른 필드의 파일을 수신합니다.

path("upload"){ 
    uploadedFile("csv"){ 
     case (metadata, file) =>{ 
      println("file received " + file.length()); 
      complete("hahahah") 
     } 
    } 
} 

파일을 성공적으로 수신 할 수 있지만이 POST 요청의 다른 입력란에 액세스 할 수 없습니다. 필드 "csv"에는 업로드 할 파일이 있고 다른 필드에는 사용자 정의 이름 인 "name"이 들어 있습니다. "name"의 데이터에 액세스 할 수 없습니다. 아무도 나에게 그것을 얻을 수있는 방법에 대한 단서를 줄 수 있습니까?

답변

1

fromFields('user)을 사용하면 사용자 이름을 얻을 수 있습니다. java.lang.IllegalStateException: Substream Source cannot be materialized more than once 그것은 문제 알려져 : 당신이 전체 요청을 읽을 수 있기 때문에

toStrictEntity(3.seconds) { 
    formFields('user) { (user) => 
    uploadedFile("csv") { 
     case (metadata, file) => { 
     println(s"file received by $user" + file.length()) 
      complete("hahahah") 
     } 
     } 
    } 
    } 
} 

나는 그것이 좋은 아이디어라고 생각하지 않습니다 https://github.com/akka/akka-http/issues/90

이 해결 방법으로는 toStrictEntity이 지시어 사용할 수 있지만 불행하게도이 예외를 얻을 것이다 엔티티를 메모리에 저장하고 작은 엔티티가 있으면 작동합니다.

더 나은 솔루션으로, 당신은, 당신의 다중 폼 데이터로부터 필요한 부품과 필드를 추출하는 예로서 uploadedFile 소스 코드를 볼 수 있습니다 그 자신의 uploadedFile 지침을 구현할 수 있습니다 https://github.com/akka/akka-http/blob/v10.0.10/akka-http/src/main/scala/akka/http/scaladsl/server/directives/FileUploadDirectives.scala

+0

감사합니다 아주 많이! 그것은 내 문제를 완벽하게 해결합니다. – Xinlong