конвертированная в base64 фотография из графика отображается как разбитое изображение - PullRequest
0 голосов
/ 12 сентября 2018

Я ломал голову (и другие), пытаясь заставить это работать.Я тяну фотографию через MS Graph API - эта часть работает нормально.Я могу получить данные (в байтах).Тем не менее, я не могу заставить изображение конвертировать должным образом, чтобы прикрепить его в виде файла и опубликовать.

Я прочитал несколько публикаций на SO и GH, а также попробовал ~ 10 различных пакетов и разновидностей npm (btoa, atob и т.д ... от отчаяния), включая пример JS из Graph docs .Ни одно решение не сработало.Все пакеты npm производят разные выходы друг от друга, и ни один из них не соответствует выводу, когда я делаю фотографию и загружаю ее в онлайн конвертер base64.Кроме того, если я возьму онлайн-преобразование и вставлю строку вывода непосредственно в код, это сработает.

Вот текущая итерация моего кода.Мы будем благодарны за любую помощь.

var optionsPhoto = {
  url: "https://graph.microsoft.com/v1.0/me/photo/$value",
  method: "GET",
  headers: {
    Authorization: "Bearer " + token
  }
};

await request(optionsPhoto, function callback(error, response, body) {
  if (!error && response.statusCode == 200) {
    photoResponse.data = [
      {
        "@odata.type": "#microsoft.graph.fileAttachment",
        contentBytes: body.split(",").toString("base64"),
        contentLocation: "https://graph.microsoft.com/v1.0/me/photo/$value",
        isinline: true,
        Name: "mypic.jpg"
      }
    ];
    photoResponse.ContentType = response.headers["content-type"].toString();
    photoResponse.Base64string = (
      "data:" +
      photoResponse.ContentType +
      ";base64," +
      photoResponse.data[0].contentBytes
    ).toString();
  } else {
    console.log(error);
  }
});

Команда .sendActivity принимает вложение только так, как показано ниже:

await dc.context.sendActivity({
  attachments: [
    { contentType: photoResponse.ContentType, contentUrl: photoResponse.Base64string }
  ]
});

1 Ответ

0 голосов
/ 12 сентября 2018

Когда вы запрашиваете фотографию /$value, ответом будет просто необработанный двоичный файл изображения.Однако клиент request по умолчанию обрабатывает тело как строку на основе * 1003.

Чтобы переобучить необработанное двоичное значение, вам нужно явно указать request, что вы этого не хотитебывает.Это делается установкой encoding: null.Из документации:

encoding - кодировка для использования в setEncoding данных ответа.Если null, body возвращается как Buffer.Все остальное (включая значение по умолчанию undefined) будет передано как кодировка параметр в toString() (то есть по умолчанию это utf8).( Примечание: , если вы ожидаете двоичные данные, вы должны установить encoding: null.)

Код будет выглядеть примерно так:

var optionsPhoto = {
  url: "https://graph.microsoft.com/v1.0/me/photo/$value",
  encoding: null, // Tells request this is a binary response
  method: "GET",
  headers: {
    Authorization: "Bearer " + token
  }
};

await request(optionsPhoto, function callback(error, response, body) {
  if (!error && response.statusCode == 200) {
    // Grab the content-type header for the data URI
    const contentType = response.headers["content-type"];

    // Encode the raw body as a base64 string
    const base64Body = body.toString("base64");

    // Construct a Data URI for the image
    const base64DataUri = "data:" + contentType + ";base64," + base64Body;

    // Assign your values to the photoResponse object
    photoResponse.data = [
      {
        "@odata.type": "#microsoft.graph.fileAttachment",
        contentBytes: base64Body,
        contentLocation: optionsPhoto.url,
        isinline: true,
        Name: "mypic.jpg"
      }
    ];
    photoResponse.ContentType = contentType;
    photoResponse.Base64string = base64DataUri;
  } else {
    console.log(error);
  }
});
...