How can I send multi part form data in post method in play scala using : scalaVersion:2.11.7 playVersion-2.1.5
You need to do a little code, then you can use it like
val data = MultipartFormData(formFields, "asdasboundarystringas")
WS.url(myUrl).post(data.body)
The code of MultipartFormData you can find on the github: https://gist.github.com/EECOLOR/7649144
UPDATE
Another method, I have been try it with Play 2.4.3
package controllers
import play.api.Play.current
import play.api.libs.ws._
import play.api._
import play.api.mvc._
import com.ning.http.client.AsyncHttpClient
import com.ning.http.client.multipart.FilePart
import com.ning.http.client.multipart.StringPart
import java.io.File
class Application extends Controller {
  def index = Action {
    val url = "http://symlink.dk/code/php/submit/"
    val asyncHttpClient:AsyncHttpClient = WS.client.underlying
    val postBuilder = asyncHttpClient.preparePost("http://symlink.dk/code/php/submit/")
    val builder = postBuilder.addBodyPart(new StringPart("myField", "abc", "UTF-8"))
      .addBodyPart(new StringPart("myField1", "abc1", "UTF-8"))
      .addBodyPart(new StringPart("myField2", "abc2", "UTF-8"))
      .addBodyPart(new FilePart("myFile", new File("app/controllers/Application.scala")))
    val response = asyncHttpClient.executeRequest(builder.build()).get();
    Ok(response.getResponseBody)
  }
}
Symlink does not verify file part, so I am not sure about it, but fileds definitely was send
UPDATE
With Authentication and file verification
package controllers
import play.api.Play.current
import play.api.libs.ws._
import play.api._
import play.api.mvc._
import com.ning.http.client.AsyncHttpClient
import com.ning.http.client.multipart.FilePart
import com.ning.http.client.multipart.StringPart
import java.io.File
import org.apache.commons.codec.binary.Base64.encodeBase64
class Application extends Controller {
  def index = Action {
    val url = "http://httpbin.org/post"
    val name = "MyUserName"
    val password = "MyPassword"
    val encodedCredentials =
      new String(encodeBase64("%s:%s".format(name, password).getBytes))
    val asyncHttpClient:AsyncHttpClient = WS.client.underlying
    val postBuilder = asyncHttpClient.preparePost(url)
    val builder = postBuilder
      .addHeader("Authorization", "Basic " + encodedCredentials)
      .addBodyPart(new StringPart("myField", "abc", "UTF-8"))
      .addBodyPart(new StringPart("myField1", "abc1", "UTF-8"))
      .addBodyPart(new StringPart("myField2", "abc2", "UTF-8"))
      .addBodyPart(new FilePart("myFile", new File("app/controllers/Application.scala")))
    val response = asyncHttpClient.executeRequest(builder.build()).get();
    Ok(response.getResponseBody)
  }
}
Echo of posted data:
{
  "args": {}, 
  "data": "", 
  "files": {
    "myFile": "package controllers\n\nimport play.api.Play.current\nimport play.api.libs.ws._\nimport play.api._\nimport play.api.mvc._\nimport com.ning.http.client.AsyncHttpClient\nimport com.ning.http.client.multipart.FilePart\nimport com.ning.http.client.multipart.StringPart\nimport java.io.File\nimport org.apache.commons.codec.binary.Base64.encodeBase64\n\nclass Application extends Controller {\n\n  def index = Action {\n//    val url = \"http://symlink.dk/code/php/submit/\"\n    val url = \"http://httpbin.org/post\"\n\n    val name = \"MyUserName\"\n    val password = \"MyPassword\"\n\n    val encodedCredentials =\n      new String(encodeBase64(\"%s:%s\".format(name, password).getBytes))\n\n    val asyncHttpClient:AsyncHttpClient = WS.client.underlying\n    val postBuilder = asyncHttpClient.preparePost(url)\n    val builder = postBuilder\n      .addHeader(\"Authorization\", \"Basic \" + encodedCredentials)\n      .addBodyPart(new StringPart(\"myField\", \"abc\", \"UTF-8\"))\n      .addBodyPart(new StringPart(\"myField1\", \"abc1\", \"UTF-8\"))\n      .addBodyPart(new StringPart(\"myField2\", \"abc2\", \"UTF-8\"))\n      .addBodyPart(new FilePart(\"myFile\", new File(\"app/controllers/Application.scala\")))\n    val response = asyncHttpClient.executeRequest(builder.build()).get();\n    Ok(response.getResponseBody)\n  }\n\n}\n"
  }, 
  "form": {
    "myField": "abc", 
    "myField1": "abc1", 
    "myField2": "abc2"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Authorization": "Basic TXlVc2VyTmFtZTpNeVBhc3N3b3Jk", 
    "Content-Length": "1991", 
    "Content-Type": "multipart/form-data; boundary=ZUeOacX0k9AyI7O12kXDuV5gucDyh2IcA", 
    "Host": "httpbin.org", 
    "User-Agent": "AHC/1.0"
  }, 
  "json": null, 
  "origin": "111.111.111.11", 
  "url": "http://httpbin.org/post"
}
UPDATE
just for clarification - if you do not need to send file as part of the form then you do not need to access underlying WSClient and can use trivial WS
val url = "http://httpbin.org/post"
val name = "MyUserName"
val password = "MyPassword"
val result = WS.url(url)
  .withAuth(name, password, WSAuthScheme.BASIC)
  .post(
      Map(
        "myField" -> Seq("myValue"),
        "myField1" -> Seq("myValue1"),
        "myField2" -> Seq("myValue2")
      )
    )
val response = Await.result(result, 10 seconds)
Ok(response.body)
request that this code send:
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "myField": "myValue", 
    "myField1": "myValue1", 
    "myField2": "myValue2"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Authorization": "Basic TXlVc2VyTmFtZTpNeVBhc3N3b3Jk", 
    "Content-Length": "51", 
    "Content-Type": "application/x-www-form-urlencoded; charset=utf-8", 
    "Host": "httpbin.org", 
    "User-Agent": "AHC/1.0"
  }, 
  "json": null, 
  "origin": "111.111.111.11", 
  "url": "http://httpbin.org/post"
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With