scala play框架文件

时间:2013-01-14 16:14:12

标签: scala file-upload playframework playframework-2.0

我可以用什么方式在play框架中模拟文件上传? 换句话说,我可以使用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 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

Post on google-groups

  

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

     

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

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执行相同的操作。

答案 2 :(得分:1)

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

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

答案 3 :(得分: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)