仅从Scala / Play获取文件名

时间:2018-02-14 04:18:39

标签: scala playframework

使用Scala / Play我正在处理上传文件。

使用我的scala.html,我有

 import org.apache.commons.io.FilenameUtils
import javax.inject._
import play.api._
import play.api.mvc._
import play.api.i18n.Messages.Implicits._
import play.api.Play.current
import play.api.data.Forms._
import play.api.data.Form
import models.MemberService




 def uploadFile = Action(parse.multipartFormData) { request =>
    request.body.file("picture").map { picture =>
      import java.io.File

      val filename = FileNameUtils.getName(picture.filename)
      picture.ref.moveTo(new File(s"/tmp/$filename"))
      Ok("upload completed")
    }.getOrElse {
      Redirect(routes.HomeController.index).flashing("error" -> "nofile exist")
    }
  }

上传文件并指向具有

的控制器
[InvalidPathException: Illegal char <:> at index 6: \tmp\C:\Users\jungj\Downloads\play-scala-starter-example.zip]

我收到InvalidPathException错误。

name := """play-scala"""
version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  jdbc,
  cache,
  ws,
  "commons-io" % "commons-io" % "2.6",
  "com.typesafe.play" %% "anorm" % "2.5.0",
  "mysql" % "mysql-connector-java" % "5.1.34",
  "org.scalatestplus.play" %% "scalatestplus-play" % "1.5.1" % Test


)

resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases"

fork in run := true

build.sbt

这是我的build.sbt

isselected

我猜我的val文件名包含了包含路径的全名,因此导致了这个问题。 我可能必须删除目录并获取文件的名称并放入val文件名以便移动到正确的路径。我对scala / play很新,想要一些详细的解释。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

picture.filename获取的文件名描述了用户计算机上传文件的实际路径。

在这种情况下,看起来用户使用的是Windows机器,文件的实际路径为C:\Users\jungj\Downloads\play-scala-starter-example.zip

因此,/tmp/$filename的值将为/tmp/C:\Users\jungj\Downloads\play-scala-starter-example.zip,这将是一条完全无效的路径。

因此,您实际需要的是一种从用户计算机中的外部路径可靠地提取实际文件名的方法。

您可以使用org.apache.commons.io.FilenameUtils

添加commons.io作为依赖项(在build.sbt中),

libraryDependencies += "commons-io" % "commons-io" % "2.6"

现在您可以按如下方式提取文件名,

import org.apache.commons.io.FilenameUtils

val filename = FilenameUtils.getName(picture.filename)