我目前正在Kotlin中开发一个使用Azure FACE API的应用程序。为了识别图像上的面孔,我需要将图像发送到服务器。我将Retrofit 2.7.0用于REST请求。每当我用谷歌搜索发送带有改进的图像时,都会遇到@Multipart
注释。例如here或here。没有一个问题说明他们为什么这样做。我发现显然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的图像。
答案 0 :(得分:2)
如果您:
...,那么不需要即可使用分段。
鉴于它的普遍性(由于来自HTML表单支持的历史记录),服务器端的数据处理库可以处理它的数量比原始文件要多,因此使用它可能更更容易与某些服务器端环境组成多部分。