我将播放从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)
谢谢。
答案 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?
}