gpt4 book ai didi

scala - 如何从 Play 中的请求中获取 InputStream

转载 作者:行者123 更新时间:2023-12-05 04:17:01 26 4
gpt4 key购买 nike

我认为这在 Play 1.x 中曾经是可能的,但我找不到如何在 Play 2.x 中做到这一点

我知道 Play 是异步的并且使用 Iteratee。但是,通常对 InputStream 有更好的支持。

(在这种情况下,我将使用像 Jackson 这样的流式 JSON 解析器来处理请求正文。)

如何从分块请求正文中获取 InputStream

最佳答案

我能够使用以下代码实现此功能:

// I think all of the parens and braces line up -- copied/pasted from code
val pos = new PipedOutputStream()
val pis = new PipedInputStream(pos)
val result = Promise[Either[Errors, String]]()

def outputStreamBodyParser = {
BodyParser("outputStream") {
requestHeader =>
val length = requestHeader.headers(HeaderNames.CONTENT_LENGTH).toLong

Future {
result.completeWith(saveFile(pis, length)) // save returns Future[Either[Errors, String]]
}

Iteratee.fold[Array[Byte], OutputStream](pos) {
(os, data) =>
os.write(data)
os
}.map {
os =>
os.close()
Right(os)
}
}
}

Action.async(parse.when(
requestHeaders => {
val maybeContentLength = requestHeaders.headers.get(HeaderNames.CONTENT_LENGTH)
maybeContentLength.isDefined && allCatch.opt(maybeContentLength.get.toLong).isDefined
},
outputStreamBodyParser,
requestHeaders => Future.successful(BadRequest("Missing content-length header")))) {
request =>
result.future.map {
case Right(fileRef) => Ok(fileRef)
case Left(errors) => BadRequest(errors)
}
}

关于scala - 如何从 Play 中的请求中获取 InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24972189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com