【发布时间】:2021-04-04 17:14:30
【问题描述】:
我正在尝试在 Quarkus 中构建多部分文件上传 REST 路由(使用 Kotlin),但遇到路由映射问题。
我在客户端发布了一个包含文本值和文件值的表单。
const formData = new FormData();
formData.append("text", text);
formData.append("file", files[0]);
fetch('http://localhost:8080/data', {
method: 'POST',
body: formData
})
从服务器端,我尝试按如下方式检索值。
class FormData(@FormParam("text") @PartType(MediaType.TEXT_PLAIN) var text:String,
@FormParam("file") @PartType(MediaType.APPLICATION_OCTET_STREAM) var file:InputStream)
@Path("/data")
class FormUploadResource {
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
fun upload(@MultipartForm form:FormData) {
println(form.text)
println(form.file)
}
}
但是,当我执行端点时,我得到一个 org.jboss.resteasy.spi.ReaderException: java.lang.NoSuchMethodException: 错误。
我已尝试确保正确接收文本和文件参数,并检查了使用以下代码传入的有效负载
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
fun upload(input:MultipartFormDataInput) {
var map = input.getFormDataMap()
map.entries.forEach {
println("""${it.key} - ${it.value}""")
if (it.value is List<InputPart>) {
it.value.forEach { ip ->
println(""" --- ${ip.getMediaType()} """ )
}
}
}
}
它说得对
text - [org.jboss.resteasy.plugins.providers.multipart.MultipartInputImpl$PartImpl@660c4317]
--- text/plain;charset=UTF-8
file - [org.jboss.resteasy.plugins.providers.multipart.MultipartInputImpl$PartImpl@3aee346]
--- application/octet-stream;charset=UTF-8
我认为 FormData 类出了点问题,RestEasy 没有自动映射到它。我尝试将“文件”的类型更改为 ByteArray 和 File,但它们也都失败了。
我一直在努力寻找 Kotlin 特定的答案,所以这也可能是 Kotlin 的一个奇怪之处。
【问题讨论】: