简体   繁体   English

播放框架文件上传无此类文件异常

[英]Play framework file upload no such file exception

I'm trying to implement file upload with play framework scala.我正在尝试使用播放框架 scala 实现文件上传。 This code works just fine in development(windows) but fails when deployed(Ubuntu).此代码在开发(Windows)中运行良好,但在部署(Ubuntu)时失败。

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

This is the error I get when I try uploading a file这是我尝试上传文件时遇到的错误

    play.api.UnexpectedException: Unexpected exception[NoSuchFileException: /tmp/playtemp5801072751187159177/multipartBody5640251320440161134asTemporaryFile -> Files/ppp.rdf]
        at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:289) ~[com.typesafe.play.play_2.11-2.5.10.jar:2.5.10]
        at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:220) ~[com.typesafe.play.play_2.11-2.5.10.jar:2.5.10]
        at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160) [com.typesafe.play.play_2.11-2.5.10.jar:2.5.10]
        at play.core.j.JavaGlobalSettingsAdapter.play$core$j$JavaGlobalSettingsAdapter$$super$onError(JavaGlobalSettingsAdapter.scala:35) [com.typesafe.play.play_2.11-2.5.10.jar:2.5.10]
        at play.core.j.JavaGlobalSettingsAdapter$$anonfun$onError$2.apply(JavaGlobalSettingsAdapter.scala:35) [com.typesafe.play.play_2.11-2.5.10.jar:2.5.10]
        at play.core.j.JavaGlobalSettingsAdapter$$anonfun$onError$2.apply(JavaGlobalSettingsAdapter.scala:35) [com.typesafe.play.play_2.11-2.5.10.jar:2.5.10]
        at scala.Option.getOrElse(Option.scala:121) [org.scala-lang.scala-library-2.11.7.jar:na]
        at play.core.j.JavaGlobalSettingsAdapter.onError(JavaGlobalSettingsAdapter.scala:35) [com.typesafe.play.play_2.11-2.5.10.jar:2.5.10]
        at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:100) [com.typesafe.play.play_2.11-2.5.10.jar:2.5.10]
        at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:100) [com.typesafe.play.play-netty-server_2.11-2.5.10.jar:2.5.10]
Caused by: java.nio.file.NoSuchFileException: /tmp/playtemp5801072751187159177/multipartBody5640251320440161134asTemporaryFile -> Files/ppp.rdf
        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86) ~[na:1.8.0_111]
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) ~[na:1.8.0_111]
        at sun.nio.fs.UnixCopyFile.move(UnixCopyFile.java:457) ~[na:1.8.0_111]
        at sun.nio.fs.UnixFileSystemProvider.move(UnixFileSystemProvider.java:262) ~[na:1.8.0_111]
        at java.nio.file.Files.move(Files.java:1395) ~[na:1.8.0_111]
        at play.api.libs.Files$TemporaryFile.moveTo(Files.scala:102) ~[com.typesafe.play.play_2.11-2.5.10.jar:2.5.10]
        at controllers.Upload$$anonfun$upload$1$$anonfun$apply$1.apply(Upload.scala:74) ~[untitled10.untitled10-1.0-sans-externalized.jar:na]
        at controllers.Upload$$anonfun$upload$1$$anonfun$apply$1.apply(Upload.scala:68) ~[untitled10.untitled10-1.0-sans-externalized.jar:na]
        at scala.Option.map(Option.scala:146) [org.scala-lang.scala-library-2.11.7.jar:na]
        at controllers.Upload$$anonfun$upload$1.apply(Upload.scala:68) ~[untitled10.untitled10-1.0-sans-externalized.jar:na]

The applications creates some files and folders when running and this currently happens so I'm sure its not Linux file permission in the directory.应用程序在运行时会创建一些文件和文件夹,目前正在发生这种情况,所以我确定它不是目录中的 Linux 文件权限。 when I go to /tmp directory I do not see the play temp files.当我转到/tmp目录时,我看不到播放临时文件。 I'm working with play 2.5 in intellij.我正在 Intellij 中使用 play 2.5。

First of all, try to give a full path instead of Files , like /var/webapps/your-app/files .首先,尝试提供完整路径而不是Files ,例如/var/webapps/your-app/files

Run the app as root temporary (using sudo) and make sure that Files (/var/webapps/your-app/files) folder exists on the disk.临时root身份运行应用程序(使用 sudo)并确保磁盘上存在Files (/var/webapps/your-app/files) 文件夹。

If the app worked as root it shows that there is something wrong about permissions.如果该应用程序以root身份运行,则表明权限有问题。 Make sure the user which the app is running by, have read/write access to /tmp and write access to Files .确保运行应用程序的用户具有对/tmp读/写访问权限和对Files写访问权限。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM