Зачем использовать multipart для загрузки изображения? - PullRequest
0 голосов
/ 22 декабря 2019

В настоящее время я разрабатываю приложение в Kotlin, которое использует FACE API Azure. Для идентификации лиц на изображениях мне нужно отправить изображение на сервер. Я использую Retrofit 2.7.0 для запросов REST. Всякий раз, когда я гуглю об отправке изображения с модификацией, я сталкиваюсь с аннотацией @Multipart. Например, здесь или здесь . Ни в одном из вопросов не указано, почему они это делают. Я обнаружил, что Multipart является стандартом для отправки файлов по 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>
}

И затем я называю это какthis:

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)
    }
}

Этот код работает для изображений размером до 6 МБ, которые поддерживает Azure.

1 Ответ

2 голосов
/ 23 декабря 2019

Если вы:

  • не генерируете запрос, отправляя HTML-форму (которая имеет встроенную поддержку для составных, но не для необработанных файлов)
  • не нужнопередать несколько частей данных (например, другие поля формы)

… тогда нет необходимости для использования multipart.

Учитывая распространенность этого (из-заистория из поддержки форм HTML) существует больше библиотек обработки данных на стороне сервера, которые могут обрабатывать их, чем для необработанных файлов, поэтому может быть проще использовать multipart с некоторыми средами на стороне сервера.

...