【问题标题】:How to upload a single bitmap image using ktor?如何使用 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 上传文件的正确方法吗?如果没有,我做错了什么?

【问题讨论】:

    标签: android android-studio kotlin http 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) } }
                      }
                          )
                      }
      

      【讨论】:

        猜你喜欢
        • 2016-10-31
        • 1970-01-01
        • 2021-07-23
        • 2017-01-21
        • 2012-06-06
        • 1970-01-01
        • 2011-12-30
        • 2014-04-08
        • 2015-12-29
        相关资源
        最近更新 更多