如何通过scalaj-http库发送multipart / data-form?

时间:2017-06-25 07:22:05

标签: scala multipartform-data

我想通过scalaj-http库实现以下curl命令:

curl -X POST --header "Content-Type:multipart/form-data;charset=UTF-8" -F file=@1.csv http://10.100.100.100:8028/compute

其中1.csv是本地文件。


我尝试了以下代码,但它不起作用:

val url = "http://10.100.100.100:8028/compute"
scalaj.http.Http(url).
   postMulti(MultiPart("file", "1.csv", "text/text", ""))
  .asString

我怀疑MultiPart("file", "1.csv", "text/text", "")不正确。


MultiPart的原型是:

object MultiPart {
   def apply(name: String, filename: String, mime: String, data: String): MultiPart = {
     apply(name, filename, mime, data.getBytes(HttpConstants.utf8))
   }

   def apply(name: String, filename: String, mime: String, data: Array[Byte]): MultiPart = {
      MultiPart(name, filename, mime, new ByteArrayInputStream(data), data.length, n => ())
   }
}

我知道参数filename应该是本地文件,但我不确定应该将其传递给其他三个参数。

1 个答案:

答案 0 :(得分:2)

来自man -F的{​​{1}}页面(强调我的):

  

(HTTP)这使curl模拟用户拥有的填充表单   按下提交按钮。这会导致curl使用   根据RFC 2388,Content-Type multipart / form-data。这样就可以了   上传二进制文件等。强迫内容'部分是一个   文件,用@符号作为文件名的前缀。要获得内容   部分来自文件,文件名前缀为符号<。该   @和<之间的差异然后是@使文件被附加   该帖子作为文件上传,而<创建一个文本字段,然后得到   文件中该文本字段的内容。

相当于此要求您以编程方式读取文件,并将内容提供为Array[Byte]

import java.nio.file.{Files, Paths}
import scalaj.http 

val bytes: Array[Byte] = Files.readAllBytes(Paths.get("/path/to/file"))
val url = "http://10.100.100.100:8028/compute"
val result = 
  Http(url)
   .postMulti(MultiPart("file", "1.csv", "text/csv", bytes))
   .asString