我想通过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
应该是本地文件,但我不确定应该将其传递给其他三个参数。
答案 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