获取DataPart文件内容而不保存文件

时间:2018-10-02 06:21:08

标签: scala playframework multipartform-data multifile-uploader


我试图获取上载文件的内容(使用POST),而不必创建/复制此文件到本地目录。在scala中有什么可能吗?
这是我的代码:

def uploadSchema = Action(parse.multipartFormData) { request =>
request.body.file("source").map { sourceFile =>
  val filename = Paths.get(sourceFile.filename).getFileName
  sourceFile.ref.moveTo(Paths.get(s"/usr/local/polymer/schema/uploads/$filename"), replace = true)
  Ok(s"Uploaded successfully!"+sourceFile.)
}.getOrElse {
  Redirect(routes.NLPController.uploadSchema).flashing("error" -> "Missing file.")
}

我想做的是,而不是做

sourceFile.ref.moveTo(Paths.get(s"/usr/local/polymer/schema/uploads/$filename"), replace = true)

做类似的事情

val content : String = Source.fromFile(file).getLines.mkString

这是我的API文件中的routes

POST   /api/upload   controllers.NLPController.uploadSchema 

这可能吗?如果没有,为什么?

1 个答案:

答案 0 :(得分:1)

您说的是要执行以下操作:

  1. 您想通过Play应用将内容上传到计算机。
  2. 您不想将其复制到计算机的本地目录。

这里的问题是,文件应该放在哪里?如果我在服务器上有一个应用程序,并且使用此方法上传文件,则该文件将始终始终位于服务器上。因为应该先将其复制到某个位置,然后再将其移动到其他位置(云,另一个备份服务器)。

如何读取文件内容?

这是另一个问题,与上传无关,而不是读取文件内容,您可以这样做:

import scala.io.Source
val myFileContent = Source.fromFile("myFile.txt").getLines.mkString

更新说明

好吧,您是在评论中说,您拥有要获取文件内容的应用程序A,然后将其发送到应用程序B。那么为什么不这样做:

  1. 带有查询字符串的路由:具有一个将文件路径作为查询字符串获取的路由:

    GET /file-content    controllers.file.readContent (path: String)
    

    然后您像这样调用应用程序:

    /file-content?path=whereever/i-want/myfile-be.txt
    
  2. 读取内容并将其放入响应的方法:然后在您的readContent方法中,将文件的正文返回给调用应用程序A的任何人:

    def readContent (filePath: String) = Action{
      implicit request => 
        Ok(Source.fromFile(filePath).getLines.mkString))
    }
    

更新说明2:请不要忘记安全性!

上述解决方案可以很好地读取数据,并将其返回。但是,您还应该考虑安全性。您不想将文件的内容提供给调用该URL的任何人。您可以在调用者应用程序中添加令牌,这样处理数据内容的应用程序将首先检查用户是否被授权,然后检查文件的内容。