PowerApps - отображение изображения, полученного пользовательским соединителем через ASP.NET API - PullRequest
0 голосов
/ 01 июня 2018

Я использую ASP.NET API, размещенный в Azure, для доставки элементов из моего бэкэнда в приложение PowerApps canvas.Некоторым элементам назначены изображения.В этих случаях я предоставляю идентификатор изображения, чтобы загрузить изображение по требованию с помощью метода GetImage (id).В этом методе я возвращаю содержимое в HTTPResponse.Это работает до сих пор.Я могу вызвать метод из браузера, и изображение отображается.На мобильном устройстве я не могу использовать URL-адрес напрямую, поскольку соединение защищено Azure AD.Мне нужно получить изображение, используя метод результата моего пользовательского соединителя.К сожалению, я не могу найти способ заполнить элемент управления изображением строкой, содержащей необработанные данные изображения.Как это можно сделать?Я мог бы вернуть любой другой тип в API, если это решит проблему.

С уважением

Свен

1 Ответ

0 голосов
/ 30 октября 2018

Вы можете вернуть изображение прямо из пользовательского разъема в приложение.В ответе на пользовательский API вам нужно определить формат как двоичный, а медиа-тип как изображение.

        "responses": {
          "default": {
            "description": "default",
            "schema": {
              "type": "string",
              "format": "binary",
              "x-ms-media-kind": "image"
            }
          }
        },

Например, это одна функция Azure, которая возвращает штрих-код с заданным кодом.(не готово к производству, больше для проверки концепции):

#r "System.Drawing"

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using ZXing;
using ZXing.Common;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{

    // parse query parameter
    string code = GetQueryStringValue(req, "code");
    string widthStr = GetQueryStringValue(req, "width") ?? "100";
    string heightStr = GetQueryStringValue(req, "height") ?? "50";

    var width = int.Parse(widthStr);
    var height = int.Parse(heightStr);

    if (code == null)
    {
        // Get request body
        dynamic body = await req.Content.ReadAsAsync<object>();
        code = body?.code;
    } 

    if (code == null)
    {
        return req.CreateResponse(
            HttpStatusCode.BadRequest,
            "Please pass a code on the query string or in the request body");
    }

    var writer = new BarcodeWriterPixelData
    {
        Format = BarcodeFormat.UPC_A,
        Options = new EncodingOptions { Height = height, Width = width }
    };

    if (string.IsNullOrEmpty(code))
    {
        code = "123456789012";
    }

    var pixelData = writer.Write(code);
    var ms = new MemoryStream();
    var bitmap = pixelData.ToBitmap();
    bitmap.Save(ms, ImageFormat.Png);
    ms.Position = 0;

    var content = new StreamContent(ms);
    content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
    return new HttpResponseMessage(HttpStatusCode.OK) { Content = content };
}

private static string GetQueryStringValue(HttpRequestMessage req, string name)
{
    return req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, name, true) == 0)
        .Value;
}

Используется пакет ZXing NuGet, который должен быть объявлен в Project.json:

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "ZXing.Net": "0.16.4"
      }
    }
   }
}

ТогдаВы определяете тип

{
  "swagger": "2.0",
  "info": {
    "title": "BarcodeGenerator",
    "description": "Barcode generator",
    "version": "1.0"
  },
  "host": "YOUR_FUNCTION_APP_NAME_HERE.azurewebsites.net",
  "basePath": "/api/",
  "schemes": [
    "https"
  ],
  "consumes": [],
  "produces": [],
  "paths": {
    "/BarcodeGenerator": {
      "get": {
        "responses": {
          "default": {
            "description": "default",
            "schema": {
              "type": "string",
              "format": "binary",
              "x-ms-media-kind": "image"
            }
          }
        },
        "summary": "Generate barcode",
        "description": "Generate a barcode.",
        "operationId": "GenerateBarcode",
        "parameters": [
          {
            "name": "code",
            "in": "query",
            "required": true,
            "type": "integer"
          },
          {
            "name": "width",
            "in": "query",
            "required": false,
            "type": "integer"
          },
          {
            "name": "height",
            "in": "query",
            "required": false,
            "type": "integer"
          }
        ]
      }
    }
  },
  "definitions": {},
  "parameters": {},
  "responses": {},
  "securityDefinitions": {},
  "security": [],
  "tags": []
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...