2013-01-14 82 views
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/filescala播放框架發佈文件

我該如何在沒有curl或瀏覽器的框架下做同樣的事情。目的是將文件從一臺服務器上傳到另一臺服務器。

回答

1

看看Windows Azure StorageAmazon S3 REST API,然後使用類似的方法,您可以使用Play's WebServices API發送文件。

您只需構建POST或PUT請求併發送它。可能您需要關心兩個應用程序之間的身份驗證和/或授權(兩個API Windows和亞馬遜使用HMAC執行此任務)

+0

如上連的應答指出,WS不支持['多部分/格式data'](http://www.ietf.org/rfc /rfc2388.txt)'POST'ing。 'multipart/form-data'在問題中由'curl -F'選項隱含。雖然如果你可以自由發送文件內容作爲請求體,你可以執行'WS.url(...)。post(fileContentsAsByteArray)'。在發送之前,它也適合'.withHeaders((「Content-Type」,...))',所以服務器知道如何處理它。 –

3

目前,無法通過WS API發佈multipart/form-data 。

您可以輕鬆地將文件發送WS.url(myUrl).post(myFile),而不是一種形式...... 一種解決方法應該是使用另一個庫,像的Apache HTTP客戶端

檢查播放郵件列表上的這個話題:[2.0] multipart/form-data in WS POST

2

Post on 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執行相同的操作。

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) 
+0

謝謝..它的效果很好 – Trp