从play 2.1迁移到2.6后上传文件不再起作用

时间:2019-12-20 16:36:44

标签: scala file-upload playframework

我将播放从2.1迁移到2.6,现在无法再上传文件了。 我遵循了文档,但是我无法弄清楚出了什么问题。

这是我的代码


def saveFile = Action(parse.multipartFormData) { request =>
    var extraInfo= ""
    request.body.dataParts.get("extraInfo").get.foreach(value => extraInfo = value)
    request.body.file("uploadedfile").map { myfile =>
      var rootPath =  "/home/user/saved/"
      val cal = Calendar.getInstance()
      val date =cal.get(Calendar.DATE )
      val year =cal.get(Calendar.YEAR )
      val month1 =cal.get(Calendar.MONTH )
      val month = month1+1
      val completePath = rootPath+year.toString()+"/"+month+"/"+date+ "/"+extraInfo+ "/"
      myfile.ref.moveFileTo(new File(completePath+myfile.filename))
      Ok("File uploaded")
    }.getOrElse {
      Ok
    }
  }

它总是给我这个错误

[error] application - 

! @7e8conb2p - Internal server error, for (POST) [/saveFile] ->

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[NoSuchFileException: /tmp/playtemp1170687002696290547/multipartBody6620818663899457015asTemporaryFile -> /home/user/saved/2019/12/20/Test/myfile_1234.xml]]
    at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:323)
    at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:241)
    at play.core.server.AkkaHttpServer$$anonfun$3.applyOrElse(AkkaHttpServer.scala:382)
    at play.core.server.AkkaHttpServer$$anonfun$3.applyOrElse(AkkaHttpServer.scala:380)
    at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:346)
    at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:345)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:36)
    at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
    at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run$1.apply$mcV$sp(BatchingExecutor.scala:91)
    at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run$1.apply(BatchingExecutor.scala:91)
Caused by: java.nio.file.NoSuchFileException: /tmp/playtemp1170687002696290547/multipartBody6620818663899457015asTemporaryFile -> /home/user/saved/2019/12/20/Test/myfile_1234.xml
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixCopyFile.move(UnixCopyFile.java:457)
    at sun.nio.fs.UnixFileSystemProvider.move(UnixFileSystemProvider.java:262)
    at java.nio.file.Files.move(Files.java:1395)
    at play.api.libs.Files$TemporaryFile$class.moveFileTo(Files.scala:129)
    at play.api.libs.Files$DefaultTemporaryFileCreator$DefaultTemporaryFile.moveFileTo(Files.scala:312)
    at play.api.libs.Files$TemporaryFile$class.moveFileTo(Files.scala:115)
    at play.api.libs.Files$DefaultTemporaryFileCreator$DefaultTemporaryFile.moveFileTo(Files.scala:312)
    at controllers.PosController$$anonfun$saveInvoiceFile$1$$anonfun$apply$3.apply(PosController.scala:45)

谢谢。

1 个答案:

答案 0 :(得分:0)

您应确保在移动文件之前创建目标文件夹。我想这就是您遇到NoSuchFileException的原因。

此外,您不应该在Scala中使用var(如果可能),并且.get上的Option也只是在引起麻烦:

def saveFile = Action(parse.multipartFormData) { request =>
    val result = for {
      extraInfos <- request.body.dataParts.get("extraInfo")
      extraInfo <- extraInfos.lastOption
      myfile <- request.body.file("uploadedfile")
    } yield {
      ...
      val targetDir = new File(completePath)
      targetDir.mkdirs()
      myfile.ref.moveFileTo(new File(targetDir, myfile.filename))
      Ok("File uploaded")
    }
    result.getOrElse(Ok) // InternalServerError instead?
}