我可以用什么方式在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或浏览器在播放框架中我怎么能这样做。目的是将文件从一台服务器上传到另一台服务器。
答案 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)
使用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 Storage或Amazon 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)