为什么要使用 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。
我目前正在使用 Azure 的 FACE API 在 Kotlin 中开发一个应用程序。要识别图像上的面孔,我需要将图像发送到服务器。我对 REST 请求使用 Retrofit 2.7.0。每当我 google 关于发送带有改造的图像时,我都会遇到 @Multipart
注释。例如
但是我的请求似乎不需要它。简单的方法似乎工作得很好。看到其他人似乎都在使用 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。