如何在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
相关产品推荐
相关产品推荐

