【问题标题】:How to upload a file using Ktor client如何使用 Ktor 客户端上传文件
【发布时间】:2020-06-07 23:11:27
【问题描述】:

我已阅读the docs 关于 Ktor 客户端中的 HTTP 请求,但它缺少文件上传的示例。它提到了PartData.FileItem,但不清楚如何使用它。

那么,我该如何准备multipart/form-data 请求在 Ktor 中上传文件?

【问题讨论】:

    标签: http kotlin ktor


    【解决方案1】:

    您应该使用submitFormWithBinaryDataformData 参数来提供部件列表。有一个辅助函数with the same name 来创建这样的列表。

    HttpClient(Apache).use { client ->
        val parts: List<PartData> = formData {
            // Regular form parameter
            append("text", "Hello, world")
    
            // File upload. Param name is "file-1" and file's name is "file.csv"
            append("file-1", "file.csv", ContentType.Text.CSV) {
                this.append("1,2,3")
            }
    
            // Verbose DSL
            val headersBuilder = HeadersBuilder()
            headersBuilder[HttpHeaders.ContentType] = "application/java-archive"
            headersBuilder[HttpHeaders.ContentDisposition] = "filename=wrapper.jar"
            this.append(
                    "file-2",
                    InputProvider { File("gradle/wrapper/gradle-wrapper.jar").inputStream().asInput() },
                    headersBuilder.build()
            )
        }
    
        client.submitFormWithBinaryData<Unit>(formData = parts /* prepared parts */) {
            url("https://hookb.in/XXX")
    
            // Query string parameters
            parameter("param-1", "value-1")
            parameter("param-2", "value-2-1")
            parameter("param-2", "value-2-2")
    
            // Headers
            headers {
                this["X-My-Header-1"] = "X-My-Header-1-Value"
                appendAll("X-My-Header-2", listOf("X-My-Header-2-Value-1", "X-My-Header-2-Value-2"))
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 2021-01-06
      • 2021-06-04
      • 2010-10-26
      • 2016-09-21
      • 1970-01-01
      • 2012-02-03
      相关资源
      最近更新 更多