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.