我可以通过什么方式在播放框架中模拟文件上传?换句话说,我可以使用这样的 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 或浏览器的情况下我怎么能做同样的事情。目的是将文件从一台服务器上传到另一台服务器。
我可以通过什么方式在播放框架中模拟文件上传?换句话说,我可以使用这样的 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 或浏览器的情况下我怎么能做同样的事情。目的是将文件从一台服务器上传到另一台服务器。
使用 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
。
目前,无法通过 WS API 发布 multipart/form-data。
您可以轻松发送 File WS.url(myUrl).post(myFile)
,但不能发送表单...解决方法应该是使用另一个库,例如Apache Http Client。
在 Play 邮件列表中查看此主题:[2.0] multipart/form-data in WS POST
以下示例允许您发布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)
查看Windows Azure Storage或Amazon S3 REST API,然后使用类似的方法,您可以使用Play 的 WebServices API发送文件。
您只需要构造 POST 或 PUT 请求并发送它。可能您需要自己关心两个应用程序之间的身份验证和/或授权(API Windows 和 Amazon 都使用HMAC来完成此任务)