问题
Experimenting with the "Play Scala File Upload Example", I've got the following warning:
[warn] a.a.ActorSystemImpl - Sending an 2xx 'early' response before end of request was received... Note that the connection will be closed after this response. Also, many clients will not read early responses! Consider only issuing this response after the request data has been completely read!
Is there any way to avoid this warning ?
The full source code is available here: https://github.com/playframework/play-scala-fileupload-example/tree/2.6.x
This is the detail of the file upload handling request:
type FilePartHandler[A] = FileInfo => Accumulator[ByteString, FilePart[A]]
/**
* Uses a custom FilePartHandler to return a type of "File" rather than
* using Play's TemporaryFile class. Deletion must happen explicitly on
* completion, rather than TemporaryFile (which uses finalization to
* delete temporary files).
*
* @return
*/
private def handleFilePartAsFile: FilePartHandler[File] = {
case FileInfo(partName, filename, contentType) =>
val path: Path = Files.createTempFile("multipartBody", "tempFile")
val fileSink: Sink[ByteString, Future[IOResult]] = FileIO.toPath(path)
val accumulator: Accumulator[ByteString, IOResult] = Accumulator(fileSink)
accumulator.map {
case IOResult(count, status) =>
logger.info(s"count = $count, status = $status")
FilePart(partName, filename, contentType, path.toFile)
}
}
/**
* A generic operation on the temporary file that deletes the temp file after completion.
*/
private def operateOnTempFile(file: File) = {
val size = Files.size(file.toPath)
logger.info(s"size = ${size}")
Files.deleteIfExists(file.toPath)
size
}
/**
* Uploads a multipart file as a POST request.
*
* @return
*/
def upload = Action(parse.multipartFormData(handleFilePartAsFile)) { implicit request =>
val fileOption = request.body.file("name").map {
case FilePart(key, filename, contentType, file) =>
logger.info(s"key = ${key}, filename = ${filename}, contentType = ${contentType}, file = $file")
val data = operateOnTempFile(file)
data
}
Ok(s"file size = ${fileOption.getOrElse("no file")}")
}
回答1:
This is a bug in Play that I just fixed here. It only happens when you make chunked requests. It can be worked around by using Play's Netty server backend instead of Akka HTTP.
来源:https://stackoverflow.com/questions/45732520/play-file-upload-warn-sending-an-2xx-early-response-before-end-of-request-w