0

我可以通过什么方式在播放框架中模拟文件上传?换句话说,我可以使用这样的 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

在播放框架中没有 curl 或浏览器的情况下我怎么能做同样的事情。目的是将文件从一台服务器上传到另一台服务器。

4

4 回答 4

4

在 google-groups 上发帖

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

例如:将照片上传到我的 Facebook 墙:

val entity = new MultipartEntity()
comment.map(msg => entity.addPart("message", new StringBody(msg, Charset.forName("UTF-8"))))
entity.addPart("source", new FileBody(photoFile))
val photoPostUrl = "https://graph.facebook.com/me/photos?access_token="+facebookAccessToken
val outputstream = new ByteArrayOutputStream
entity.writeTo(outputstream)
val header = (entity.getContentType.getName, entity.getContentType.getValue)
WS.url(photoPostUrl).withHeaders(header).post(outputstream.toByteArray()).await(5000).get.json

依赖:"org.apache.httpcomponents" % "httpclient" % "4.3.1""org.apache.httpcomponents" % "httpmime" % "4.3.1"

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

于 2013-10-24T09:38:57.603 回答
3

目前,无法通过 WS API 发布 multipart/form-data。

您可以轻松发送 File WS.url(myUrl).post(myFile),但不能发送表单...解决方法应该是使用另一个库,例如Apache Http Client

在 Play 邮件列表中查看此主题:[2.0] multipart/form-data in WS POST

于 2013-01-14T20:30:39.027 回答
1

以下示例允许您发布multipart/form-data. 这是一个仅适用于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)
于 2013-11-25T21:21:58.423 回答
1

查看Windows Azure StorageAmazon S3 REST API,然后使用类似的方法,您可以使用Play 的 WebServices API发送文件。

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

于 2013-01-14T20:25:02.467 回答