如何使用 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/jsonmultipart/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?

如何在节点js中使用单个api保存文本字段值以及文件上传?

如何访问位图图像中的每个字节

如何在xamarin android中将位图图像转换为gif?

如何从 django admin 中的单个“选择文件”选择器上传多个图像

如何使用java在android移动设备中获取位图uri