You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ktor中正确传递Form-Data请求体?

Ktor Form-Data 文件上传问题解决

首先确认你已经在项目中添加了Ktor的Multipart依赖,这是处理Form-Data上传的必要条件:

// 在build.gradle.kts的commonMain依赖中添加
implementation("io.ktor:ktor-client-multipart:$ktorVersion")

你原来的代码只简单传入了attachment,但缺少文件的元信息(文件名、内容类型)——Postman会自动为上传的文件填充这些信息,而Ktor需要手动指定。以下是修正后的代码:

情况1:attachment是File对象

val response: HttpResponse = httpClient.post(endpoint) {
    headers {
        append(HttpHeaders.Authorization, getAuthorizationHeader())
    }
    setBody(MultiPartFormDataContent(
        formData {
            append(
                key = "attachment",
                value = attachment.readBytes(),
                headers = Headers.build {
                    append(HttpHeaders.ContentDisposition, "form-data; name=\"attachment\"; filename=\"${attachment.name}\"")
                    // 根据你的文件类型修改Content-Type,比如图片用image/jpeg,文档用application/pdf
                    append(HttpHeaders.ContentType, "application/octet-stream")
                }
            )
        }
    ))
}

情况2:attachment是ByteArray(内存中的文件内容)

val response: HttpResponse = httpClient.post(endpoint) {
    headers {
        append(HttpHeaders.Authorization, getAuthorizationHeader())
    }
    setBody(MultiPartFormDataContent(
        formData {
            append(
                key = "attachment",
                value = attachment,
                headers = Headers.build {
                    append(HttpHeaders.ContentDisposition, "form-data; name=\"attachment\"; filename=\"your-file-name.ext\"")
                    append(HttpHeaders.ContentType, "application/octet-stream")
                }
            )
        }
    ))
}

关键说明:

  • 必须用MultiPartFormDataContent包裹formData块,确保请求头被自动设置为multipart/form-data
  • Content-Disposition头要明确指定name(对应接口的参数名)和filename(文件名)
  • ContentType要和你在Postman中上传文件时的类型一致,比如上传图片就用image/png或image/jpeg

内容的提问来源于stack exchange,提问作者Dinesh G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:52:11