PlayFramework如何在上传时获得正确的文件路径

时间:2016-02-29 06:37:33

标签: scala playframework playframework-2.0

我玩框架版本2.46并且我将文件上传到我的亚马逊S3帐户,但是我一直在获取tmp文件的路径。这是我的代码

.tickLabels .xAxis { 
  color:transparent !important; 
}

给我提出问题的部分是 myfile.getAbsolutePath 部分,它返回一个未找到的错误文件。我确切知道为什么,但不知道如何解决它,例如,如果我在 C:\ mypictures \ Users \ bus.jp g有一个文件,那么 myfile.getAbsolutePath 会把它变成 C:\ mypictures \ Calc \ bus.jpg 。我的PlayFramework应用程序名为Calc和offcourse,该位置不存在该图片。

  • 作品:新文件(" C:\ mypictures \ Users \ bus.jpg")= C:\ mypictures \ Users \ bus.jpg
  • 无效新文件(myfile.getAbsolutePath)= C:\ mypictures \ Calc \ bus.jpg

如何修复此问题以便上传正确的文件位置?我被困在这里几个小时

1 个答案:

答案 0 :(得分:1)

您似乎正在寻找Web应用程序从您计算机上的该位置提取文件,而不是在HTTP请求中接收文件。

val myfile:File= new File(file.filename)将不起作用,因为您正在获取上传文件的名称(而不是路径),并使用该名称和当前工作目录创建File - 这是当你用它来获取绝对目录时反映出来。

也不需要它,因为您已经拥有TemporaryFile。来自documentation

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

因此,您可以使用该临时文件为您提供所需的一切。然后你的代码变成

def upload = Action (parse.multipartFormData) { implicit request =>
  request.body.file("file").map { file =>
    val credentials: AWSCredentials = new BasicAWSCredentials("Key", "Secret-key")
    val s3client: AmazonS3 = new AmazonS3Client(credentials)
    val bucketName: String = "myfolder"

    s3client.putObject(new PutObjectRequest(bucketName,
                                            file.filename,
                                            file.ref.file))
      Ok("File uploaded")
    }.getOrElse {
      Redirect(routes.Application.index).flashing(
        "error" -> "Missing file")
    }
}