2017-04-22 7 views
0

Play Framework 및 Scala의 새로운 기능입니다. 나는 재생중인 웹 소켓을 사용하여 파일 업로드를 작성하려고했습니다. 나는 그것이 ByteString을 사용하여 끝날 수 있다고 알았습니다. 그러나 직면하고있는 문제는 응답 메시지를 으로 유지할 수 없다는 것입니다.ByteString 및 String in String을 처리 할 Websocket 2.5

def upload = WebSocket.accept[ByteString, String] { request => 
    ActorFlow.actorRef(out => UploadActor.props(out)) 
} 
예외는 다음과 점점 오전

,

play.sbt.PlayExceptions$CompilationException: Compilation error[could not find implicit value for parameter transformer: play.api.mvc.WebSocket.MessageFlowTransformer[akka.util.ByteString,String]] 
    at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) 
    at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) 
    at scala.Option.map(Option.scala:145) 
    at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:49) 
    at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:44) 
    at scala.Option.map(Option.scala:145) 
    at play.sbt.run.PlayReload$.taskFailureHandler(PlayReload.scala:44) 
    at play.sbt.run.PlayReload$.compileFailure(PlayReload.scala:40) 
    at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17) 
    at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17) 

웹 소켓은 다음과 같다 처리하는 배우,

이 이
class UploadActor(out: ActorRef) extends Actor{ 
    out ! "Hello" 

    def receive = { 
    case msg: ByteString => { 
     val p = new PrintWriter(new File("/tmp/newFile.mp4")) 
     p.print(msg.asByteBuffer) 
     p.flush() 
     out ! "file received" 
    } 
    case msg: String => out ! ("Got it "+ msg) 
    } 
} 

답변

1

Playframework 웹 소켓 지원 따라서 Akka 스트림에 의존하고 가를 나타냅니다 일반 웹 소켓 메시지는 Flow (Message ~ Message) 형식입니다. 입력 및 출력 매개 변수의 다른 조합은 암시 적으로 MessageFlowTransformer[In, Out]으로 제공되어야합니다.

이제 몇 가지 변압기가 Playframework에서 제공됩니다. MessageFlowTransformer[String, String], MessageFlowTransformer[ByteString, ByteString] 등 전체 목록은 source code을 확인하십시오.

ByteString부터 String까지 원하는 경우 범위에 자체 변압기를 제공해야합니다. 그것은 다음과 같을 것이다 다음 docs

implicit val byteStringToStringMessageFlowTransformer: MessageFlowTransformer[ByteString, String] = { 
     new MessageFlowTransformer[ByteString, String] { 
     def transform(flow: Flow[ByteString, String, _]) = { 
      AkkaStreams.bypassWith[Message, ByteString, Message](Flow[Message] collect { 
      case BinaryMessage(data) => Left(data) 
      case TextMessage(_) => 
       Right(CloseMessage(
       Some(CloseCodes.Unacceptable), 
       "This WebSocket only supports binary frames")) 
      })(flow map TextMessage.apply) 
     } 
     } 
    } 

더 많은 정보를 원하시면.

+0

컨트롤러에 주어진 코드를 넣었지만 여전히 같은 예외입니다. – vinnu313