Jogar! 2.1+ FileUpload sem arquivos temporários

Ao enviar um arquivo no Play! 2.1+ o método sugerido (e implementação padrão) faz com que o conteúdo do arquivo seja despejado em um arquivo temporário.

(consulte http://www.playframework.com/documentation/2.1.1/ScalaFileUpload )

Além disso, a API permite que você obtenha o conteúdo do arquivo copiando o arquivo temporário para um arquivo sob seu controle:

picture.ref.moveTo(new File("/tmp/picture"))

Implementação apenas de mem

É possível criar uma implementação somente mem (tem uma desvantagem, você pode OOME!).

Passo 1

Faça com que sua ação conheça o manuseio de várias partes, declarando-o:

def doUpload = Action(multipartFormData(myHandleFilePart)) {
request
=> [...]

Passo 2

Crie um FilePart Handler para retornar o tipo que você deseja (no meu caso, Array [Byte]):

private def myHandleFilePart: PartHandler[FilePart[Array[Byte]]] = {
handleFilePart
{
case FileInfo(partName, filename, contentType) =>
val baos
= new java.io.ByteArrayOutputStream()
Iteratee.fold[Array[Byte], java.io.ByteArrayOutputStream](baos) {
(os, data) =>
os
.write(data)
os

}.mapDone {
os
=>
os
.close()
baos
.toByteArray
}
}
}

etapa 3

Revise o consumo de seu arquivo, pois a solicitação agora retornará um FilePart que contém um Array [Byte] ref:

def doUpload = Action(multipartFormData(myHandleFilePart)) {
request
=>
request
.body.file("fileUpload").map {
file
=>
val bytes
: Array[Byte] = file.ref
[...]

Aproveitar!

PS: Você também pode passar os blocos de bytes à medida que chegam, canalizando o iterate de recebimento com a próxima etapa do gerenciamento de arquivos, mas isso está fora do escopo deste trecho.