我正在使用Ktor 1.2.2,我有一个InputStream对象,我想用它作为我向下发出的HttpClient请求的主体。在Ktor 0.95之前,有一个InputStreamContent对象似乎就是这样做的,但它在Ktor 1.0.0版本中被删除了(不幸的是,无法找出原因)。
我可以使用ByteArrayContent(见下面的代码)使其工作,但我宁愿找到一个不需要将整个InputStream加载到内存中的解决方案...
ByteArrayContent(input.readAllBytes())
这段代码是一个简单的测试用例,它模拟了我试图实现的目标:
val file = File("c:\\tmp\\foo.pdf")
val inputStream = file.inputStream()
val client = HttpClient(CIO)
client.call(url) {
method = HttpMethod.Post
body = inputStream // TODO: Make this work :(
}
// [... other code that uses the response below]
如果我遗漏了任何相关信息请告诉我,
谢谢!
4条答案
按热度按时间mqkwyuun1#
实现这一点的一种方法是创建OutgoingContent.WriteChannelContent的子类,并将其设置为post请求的主体。
示例如下所示:
xuo3flqw2#
Ktor 1.2.2中唯一的API(我发现...)可能发送多部分请求,这需要您的接收服务器能够处理它,但它确实支持直接的InputStream。
从他们的文档中:
话虽如此,我不知道它内部是如何工作的,可能仍然会将整个流加载到内存中。
readBytes方法是缓冲的,因此不会占用整个内存。
需要注意的是,对于InputStream上的大多数方法,仍然需要关闭inputStream
来源:https://ktor.io/clients/http-client/call/requests.html#the-submitform-and-submitformwithbinarydata-methods
Kotlin来源:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-input-stream/index.html
n9vozmp43#
这是我在Ktor 1.3.0上上传文件到GCP的工作原理:
xkftehaa4#
我无法从@stefan获得解决方案,下面是我的另一个例子(针对Ktor 2.2.2):