Scala Play 2.0.2 загрузка нескольких файлов

Я новичок в Play и scala. Мое требование - предоставить кнопку обзора, где мы можем выбрать несколько файлов и загрузить эти файлы. Вот код, который я написал:

в файле scala.html:

<input type="file" name="files" multiple="multiple" id="files" size="30">

в контроллере:

def upload = Action(parse.multipartFormData) { request =>
  request.body.file("files").map { picture =>
    import java.io.File
    val filename = picture.filename 
    val contentType = picture.contentType
    picture.ref.moveTo(new File("/tmp/picture"))
    Ok("File uploaded")
  }.getOrElse {
    Redirect(routes.Application.index).flashing(
      "error" -> "Missing file"
    )
  }
}

Но я не могу загрузить несколько файлов. Есть идеи, в чем здесь проблема?


person Prateek    schedule 06.09.2012    source источник
comment
Что на самом деле происходит, когда вы загружаете несколько файлов? Они молча игнорируются? вы получаете сообщение об ошибке?   -  person Jean    schedule 13.09.2012
comment
может кто подскажет как добраться? я имею в виду размер загруженного изображения.   -  person Vicky    schedule 18.12.2015


Ответы (3)


Во-первых, вам не нужно

="multiple"

Это работает эквивалентно

<input type="file" name="files" multiple id="files" size="30">


Чтобы загружать несколько файлов, при определении формы необходимо иметь атрибут

enctype="multipart/form-data"

Например, при использовании помощников

@helper.form(action = routes.MyController.submit(), 'enctype -> "multipart/form-data", 'id -> "myform")

или если ты не

<form action=... enctype="multipart/form-data" id="myform">

В вашем контроллере вы хотите попробовать что-то вроде этого (для Java я уверен, что это похоже на Scala)

//Get all files bound to the form when submitted 
List<FilePart> plate_files = request().body().asMultipartFormData().getFiles();
//Get files from a specific name or id
FilePart myfile = request().body().asMultipartFormData().getFile("files");

Затем вы можете использовать эти итерации через объекты FilePart.

Надеюсь, это похоже на scala

Ваше здоровье

person Omar Wagih    schedule 20.09.2012
comment
Большое спасибо, так полезно - person Ducaz035; 24.09.2013

Вы также можете попробовать это, если хотите:

def uploadFiles: Action[AnyContent] { request =>
  val files: Option[Seq[FilePart[TemporaryFile]]] = request.body.asMultipartFormData.map(_.files)
   val filesJavaIO: Option[Seq[File]] = files map { fileSeq => fileSeq map { file =>
    file.ref.moveTo(new File("/tmp/myFiles"))
  }
  }
Ok("File uploaded")

}
person Arpit Suthar    schedule 09.11.2015
comment
request.body.files map { файл => file.ref.moveTo (новый файл (/tmp/myfiles/+file.filename)) } - person robor; 08.05.2016

Очень просто, просто посмотрите на этот рабочий код -

def uploadAll = Action(parse.multipartFormData) { implicit request =>
  val files = request.body.files.toArray
  files.foreach(file => {
    val filename = Paths.get(file.filename).getFileName
    file.ref.moveTo(Paths.get(s"C:/Users/tusharw/Documents/Play Uploads/$filename"), replace = true)
  })
  Ok("Files uploaded")
}

Или, как сказал @robor78, это более простой способ -

def uploadAll = Action(parse.multipartFormData) { implicit request =>
  request.body.files map { file =>
    file.ref.moveTo(Paths.get("C:/Users/tusharw/Documents/Play Uploads/"+file.filename), replace = true)
  }
  Ok("Files uploaded")
}

И добавьте multiple к вашему вводу. Вот и все!

Обратите внимание, что здесь Paths принадлежит java.nio.file.Paths. Вместо этого вы можете использовать new File("/somepath").

person Tushar Walzade    schedule 03.04.2018