以什麼方式可以模擬播放框架中的文件上傳? 換句話說,我可以用這樣的curl命令將文件上傳到服務器: curl -k -v -H「X-Agile-Authorization:token」-F uploadFile = c:\ 1.txt -F directory =/testpost -F basename = 1.txt https:// api/post/filescala播放框架發佈文件
我該如何在沒有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/filescala播放框架發佈文件
我該如何在沒有curl或瀏覽器的框架下做同樣的事情。目的是將文件從一臺服務器上傳到另一臺服務器。
看看Windows Azure Storage或Amazon S3 REST API,然後使用類似的方法,您可以使用Play's WebServices API發送文件。
您只需構建POST或PUT請求併發送它。可能您需要關心兩個應用程序之間的身份驗證和/或授權(兩個API Windows和亞馬遜使用HMAC執行此任務)
目前,無法通過WS API發佈multipart/form-data 。
您可以輕鬆地將文件發送WS.url(myUrl).post(myFile)
,而不是一種形式...... 一種解決方法應該是使用另一個庫,像的Apache HTTP客戶端。
檢查播放郵件列表上的這個話題:[2.0] multipart/form-data in WS POST
隨着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
執行相同的操作。
以下示例允許您發佈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)
謝謝..它的效果很好 – Trp
如上連的應答指出,WS不支持['多部分/格式data'](http://www.ietf.org/rfc /rfc2388.txt)'POST'ing。 'multipart/form-data'在問題中由'curl -F'選項隱含。雖然如果你可以自由發送文件內容作爲請求體,你可以執行'WS.url(...)。post(fileContentsAsByteArray)'。在發送之前,它也適合'.withHeaders((「Content-Type」,...))',所以服務器知道如何處理它。 –