为什么使用分段上传图片?

时间:2019-12-22 17:11:34

标签: http kotlin retrofit2 multipart

我目前正在Kotlin中开发一个使用Azure FACE API的应用程序。为了识别图像上的面孔,我需要将图像发送到服务器。我将Retrofit 2.7.0用于REST请求。每当我用谷歌搜索发送带有改进的图像时,都会遇到@Multipart注释。例如herehere。没有一个问题说明他们为什么这样做。我发现显然is the standard是通过http发送文件的。

但是我似乎不需要它。简单的方法似乎很好用。看到其他人似乎都使用了multipart,我可能会丢失一些东西。所以我的问题是,为什么在这种简单方法上需要使用Multipart?

我目前正在使用这种方法:

interface FaceAPI {
    @Headers(value = ["$CONTENT_TYPE_HEADER: $CONTENT_TYPE_OCTET_STREAM"])
    @POST("face/v1.0/detect")
    suspend fun detectFace(
        @Query("recognitionModel") recognitionModel: String = RECOGNITION_MODEL_2,
        @Query("detectionModel") detectionModel: String = DETECTION_MODEL_2,
        @Query("returnRecognitionModel") returnRecognitionModel: Boolean = false,
        @Query("returnFaceId") returnFaceId: Boolean = true,
        @Query("returnFaceLandmarks") returnFaceLandmarks: Boolean = false,
        @Header(HEADER_SUBSCRIPTION_KEY) subscriptionKey: String = SubscriptionKeyProvider.getSubscriptionKey(),
        @Body image: RequestBody
    ): Array<DetectResponse>
}

然后我这样称呼它:

suspend fun detectFaces(image: InputStream): Array<DetectResponse> {
    return withContext(Dispatchers.IO) {
        val bytes = image.readAllBytes()
        val body = bytes.toRequestBody(CONTENT_TYPE_OCTET_STREAM.toMediaTypeOrNull(), 0, bytes.size)
        val faceApi = ApiFactory.createFaceAPI()
        faceApi.detectFace(image = body)
    }
}

此代码适用于Azure支持的最大6 MB的图像。

1 个答案:

答案 0 :(得分:2)

如果您:

  • 不能通过提交HTML表单(该表单具有对多部分的本机支持,但不支持原始文件)来生成请求
  • 不需要传送多个数据(例如其他表单字段)

...,那么不需要即可使用分段。

鉴于它的普遍性(由于来自HTML表单支持的历史记录),服务器端的数据处理库可以处理它的数量比原始文件要多,因此使用它可能更更容易与某些服务器端环境组成多部分。