如何使用 ktor 上传单个位图图像?
Posted
技术标签:
【中文标题】如何使用 ktor 上传单个位图图像?【英文标题】:How to upload a single bitmap image using ktor? 【发布时间】:2021-12-30 14:57:37 【问题描述】:我正在尝试将图像上传到应该以“标准方式”接受文件的 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()
)
主要的“body”部分是一些在 'block' 参数中传递的 json。这些数据正按预期安全到达。
但是图像本身的二进制数据要么没有显示在服务器端,要么被服务器忽略,因为我没有正确设置一些“关键”值。
这是使用 Ktor 上传文件的正确方法吗?如果没有,我做错了什么?
【问题讨论】:
【参考方案1】:第二次追加调用是发送名称为image
和文件名image.jpg
的部件的正确方法。问题是您不能在一个请求中同时发送application/json
和multipart/form-data
内容。
【讨论】:
【参考方案2】:实际上你的方法是正确的,我的后端人员遇到了同样的问题,他将我的请求作为byteArray
文件接收并且无法识别。所以我所做的是将文件直接指定到正文而不是使用submitFormWithBinaryData
,如下所示..
'srcBitmap' is a byteArray containing the JPG data.
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)
)
【讨论】:
以上是关于如何使用 ktor 上传单个位图图像?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Multiplatform Ktor 和 Coil 之间共享 HttpClient?
如何在xamarin android中将位图图像转换为gif?