Max
Max

Reputation: 3

Microsoft Cognitive Services Vision API: Sending multipart data

I am trying to call the Microsoft Cognitive API by passing multiple images as per documentation and using the multipart/form-data, but I am getting an error that says "Unsupported Media Type". I have tried to use both ByteArray and StreamContent.

Api documentation.

private static byte[] GetImageAsByteArray(Stream fileStream)
{
    using (var binaryReader = new BinaryReader(fileStream))
    {
        return binaryReader.ReadBytes((int)fileStream.Length);
    }
}

static void Main(string[] args)
{
    var uriBase = "https://westus.api.cognitive.microsoft.com/vision/v1.0/recognizeText";
    var subscriptionKey = "<subscriptionKey>";
    var client = new HttpClient();
    var uri = string.Concat(uriBase, "?", "language=en&detectOrientation=true");
    var images = new List<Stream>();
    var img = Image.FromStream(File.Open("<imageName>", FileMode.Open));
    var stream = new MemoryStream();

    img.Save(stream, ImageFormat.Bmp);
    stream.Position = 0;

    images.Add(stream);

    using (var content = new MultipartFormDataContent())
    {
        foreach (var image in images)
        {
            //content.Add(new StreamContent(stream));
            content.Add(new ByteArrayContent(GetImageAsByteArray(image)));
        }

        client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
        content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data");

        var response = client.PostAsync(uri, content).Result;
    }
}

Upvotes: 0

Views: 798

Answers (1)

Martin van Delft
Martin van Delft

Reputation: 457

I am trying to call the Microsoft Cognitive API by passing multiple images as per documentation and using the multipart/form-data, but I am getting an error that says "Unsupported Media Type".

It is not possible to send multiple images, regardless of header.

Please refer to the documentation Step 2, it mentions:

The basic way to perform the Computer Vision API call is by uploading an image directly. This is done by sending a "POST" request with application/octet-stream content type together with the data read from the image.

Example code can be found here

Test environment here. Notice regardless of header, it is still sending 1 image. The limits also mention a single image.

Upvotes: 0

Related Questions