Play API 프레임 워크를 사용하여 파일을 다운로드하려고합니다. 모든 데이터 액세스 레이어가 이미 Futures로 구현되었으므로 비동기 작업에서도 작동하도록 다운로드하고 싶습니다. 그러나 다음 코드는 작동하지 않습니다. 그리고 작동하지 않는다는 것은 클라이언트로 보낸 파일이 서버의 파일과 동일하지 않음을 의미합니다.
val sourcePath = "/tmp/sample.pdf"
def downloadAsync = Action.async {
Future.successful(Ok.sendFile(new java.io.File(sourcePath)))
}
그러나이 작품은 다음과 같이 작동합니다.
def download = Action {
Ok.sendFile(new java.io.File(sourcePath))
}
비동기 메서드를 작동시키는 방법에 대한 제안이 있습니까?
이미 차단 되지 않았으므로 실제로 Action.async
여기에서 사용할 필요가 없습니다 Ok.sendFile
. 에서 워드 프로세서 :
Play 액션은 기본적으로 비동기식입니다. 예를 들어 아래 컨트롤러 코드에서 코드의
{ Ok(...) }
일부는 컨트롤러의 메서드 본문이 아닙니다. Action 유형의 개체를 만드는Action
개체의apply
메서드 에 전달되는 익명 함수입니다 . 내부적으로 작성한 익명 함수가 호출되고 그 결과는Future
.def echo = Action { request => Ok("Got request [" + request + "]") }
참고 : 모두
Action.apply
와Action.async
같은 방식으로 내부적으로 처리하는 작업 개체를 만들 수 있습니다. 두 가지 유형 (동기식 및 비동기식)이 아닌 비동기식 단일 유형의 Action이 있습니다..async
빌더는 쉽게 비 차단 코드를 작성하게하는 미래를 반환하는 API를 기반으로 작업을 생성 단순화하기 위해 단지 시설입니다.
즉,이 특정 경우에 Result
를 a로 래핑하는 것에 대해 걱정하지 말고 Future
그냥 return하십시오 Ok.sendFile
.
마지막으로 두 버전 모두 예상대로 작동합니다 (파일이 제대로 전달되었습니다). 행동을 선언 한 방법과 관련이없는 또 다른 문제가있을 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다