scala播放框架post文件

scala播放框架post文件,scala,file-upload,playframework,playframework-2.0,Scala,File Upload,Playframework,Playframework 2.0,我可以用什么方式在play framework中模拟文件上载? 换句话说,我可以使用以下curl命令将文件上载到服务器: curl-k-v-H“X-Agile-Authorization:token”-F uploadFile=c:\1.txt-F directory=/testpost-F basename=1.txt https://api/post/file 在play framework中,如果没有curl或浏览器,我如何做同样的事情。其目的是将文件从一台服务器上载到另一台服务器。请查看

我可以用什么方式在play framework中模拟文件上载? 换句话说,我可以使用以下curl命令将文件上载到服务器: curl-k-v-H“X-Agile-Authorization:token”-F uploadFile=c:\1.txt-F directory=/testpost-F basename=1.txt https://api/post/file

在play framework中,如果没有curl或浏览器,我如何做同样的事情。其目的是将文件从一台服务器上载到另一台服务器。

请查看或REST API,然后使用类似的方法发送文件


您只需要构造POST或PUT请求并发送它。您可能需要自己关心两个应用程序之间的身份验证和/或授权(Windows和Amazon都使用此任务的API)

目前,无法通过WS-API发布多部分/表单数据

您可以轻松地发送文件
WS.url(myUrl).post(myFile)
,但不能发送表单。。。 解决方法应该是使用另一个库,如ApacheHTTP客户端

在Play邮件列表中查看此主题:

使用org.apache.http.entity.mime.MultipartEntity,您可以轻松地操作多部分数据。然后像您所做的那样将其写入字节数组缓冲区

示例:将照片上载到我的facebook墙:

依赖项:
“org.apache.httpcomponents”%“httpclient”%“4.3.1”
“org.apache.httpcomponents”%“httpime”%“4.3.1”


如果性能是一个问题,您可以对WS的底层客户端
WS.client

执行同样的操作。下面的示例允许您发布
多部分/表单数据。它是一个简单的版本,只适用于
String
值,但是可以很容易地修改它以使用其他类型的数据

type NameValuePair = (String, String)
case class MultipartFormData(elements: Seq[NameValuePair], boundary: String)(
  implicit codec: Codec) {

  private val HTTP_SEPARATOR = "\r\n"
  private val actualBoundary = "--" + boundary
  private val endBoundary = actualBoundary + "--" + HTTP_SEPARATOR

  private val contentType = "multipart/form-data; boundary=" + boundary
  private val content = elements.map(toPart).mkString + endBoundary

  val body = Body(content)

  case class Body(content: String)

  object Body {
    implicit val contentTypeOf:ContentTypeOf[Body] =
      ContentTypeOf(Some(contentType))
    implicit val writes: Writeable[Body] =
      Writeable(body => codec.encode(body.content))
  }

  private def toPart(nameValuePair: NameValuePair) = {
    val (name, value) = nameValuePair
    actualBoundary + HTTP_SEPARATOR +
      "Content-Disposition: form-data; name=\"" + name + "\"" + HTTP_SEPARATOR +
      HTTP_SEPARATOR +
      value + HTTP_SEPARATOR
  }
}
用法如下:

val data = MultipartFormData(formFields, "asdfghjkl123")

WS.url(myUrl).post(data.body)

正如Julien在上面的回答中所指出的,WS不支持
POST
ing<问题中的
curl-F
选项暗示了code>multipart/form data
。不过,如果您可以自由地将文件内容作为请求正文发送,则只需执行
WS.url(…).post(fileContentsAsByteArray)
。还可以在发送前放入一个
。带有标题((“内容类型”,…)
,这样服务器就知道如何处理它了。这里的注释对象是什么?哪个包?
val data = MultipartFormData(formFields, "asdfghjkl123")

WS.url(myUrl).post(data.body)