如何使用 ktor 上传单个位图图像?

5

我正在尝试上传一张图片到一个声称能够以“标准方式”接收文件的http服务器上。我将从互联网上找到的许多示例组合在一起,每个示例都完成了我想要的一小部分,组合成了这个解决方案。

'srcBitmap' is a byteArray containing the JPG data.

val response: HttpResponse = httpClient.submitFormWithBinaryData(
    url = URLUploadFile,
    formData = formData {
        append("bitmapName", "image.jpg")
        append("image", srcBitmap, Headers.build {
            append(HttpHeaders.ContentType, "image/jpg")
            append(HttpHeaders.ContentDisposition, "filename=image.jpg")
        })
    },
    block = {
        headers {
            append(HttpHeaders.ContentType, contentTypeString)
            append(HttpHeaders.CacheControl, "no-cache")
            append("my-app-authtoken", PREFKEY_AUTHTOKEN)
            append("my-app-id", PREFKEY_USERID)
        }
        contentType(ContentType.Application.Json)
        body = jsonBody.toString()
    })


主要的“主体”部分是通过“block”参数传递的一些JSON数据。这些数据被安全地传递到了目的地。
但是图像本身的二进制数据可能没有显示在服务器端,或者被服务器忽略,因为我没有适当设置一些“键”值。
这是否是使用Ktor上传文件的正确方式?如果不是,我做错了什么?
2个回答

0

实际上你的方法是正确的,我曾经遇到过和我的后端开发人员一样的问题,他以byteArray文件的形式接收我的请求,但无法识别。所以我直接将文件指定到正文中,而不是使用submitFormWithBinaryData,如下所示...

'srcBitmap'是一个包含JPG数据的byteArray

 httpClient.post<RESPONSE>(URL) {
            headers {
                append(HttpHeaders.Accept, ContentType.Application.Json)
            }
            body = MultiPartFormDataContent(
                formData {
                    this.append(FormPart("bitmapName", "image.jpg"))
                    this.appendInput(
                        key = "image",
                        headers = Headers.build {
                            append(
                                HttpHeaders.ContentDisposition,
                                "filename=image.jpg"
                            )
                        },
                    ) { buildPacket { writeFully(srcBitmap) } }
                }
                    )
                }

0
第二个附加调用是发送名称为image和文件名image.jpg的部分的正确方法。问题在于您无法在一个请求中同时发送application/jsonmultipart/form-data内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接