为什么要使用 multipart 上传图片?

Why use multipart to upload an image?

我目前正在使用 Azure 的 FACE API 在 Kotlin 中开发一个应用程序。要识别图像上的面孔,我需要将图像发送到服务器。我对 REST 请求使用 Retrofit 2.7.0。每当我 google 关于发送带有改造的图像时,我都会遇到 @Multipart 注释。例如 or . None of the questions state why they do it. I found that apparently Multipart 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 的图像。

如果你:

  • 未通过提交 HTML 表单(其本机支持多部分但不支持原始文件)生成请求
  • 不需要传送多条数据(例如其他表单字段)

…那么不需要使用multipart。

鉴于它的流行(由于 HTML 表单支持的历史)有更多的服务器端数据处理库可以处理它,然后是原始文件,所以它可能是 更容易在某些服务器端环境中使用 multipart。