【问题标题】:Get Profile image from Microsoft Graph从 Microsoft Graph 获取配置文件图像
【发布时间】:2023-08-21 22:09:01
【问题描述】:

我正在尝试使用 Microsoft Graph 获取当前用户的个人资料图像。我正在使用msgraph-sdk-php

以下代码获取照片,但返回 jpeg 文件的二进制数据。

if (session_status() == PHP_SESSION_NONE)
        session_start();

    $graph = new Graph();
    $graph->setAccessToken($_SESSION['access_token']);

    $photo = $graph->createRequest("GET", "/me/photo/\$value")
                           ->execute();

    return $photo->getRawBody();

It seems 我需要将响应类型设置为 blob 才能以更正常的方式使用图像,但是如何使用 Guzzle 做到这一点?

我也用 cUrl 试过,但同样的问题,我得到的只是二进制数据:

$curl = curl_init();

    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://graph.microsoft.com/v1.0/me/photos/48x48/\$value",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_HTTPHEADER => array(
            "authorization: Bearer $at",
            "cache-control: no-cache",
            "Content-type: image/jpeg",
            "Accept: blob",
            "postman-token: caccedb3-8253-e6aa-7e30-25052bc28f2f"
        ),
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        return $response;
    }

【问题讨论】:

标签: laravel microsoft-graph-api guzzle


【解决方案1】:

假设您使用的是 Laravel(您已标记)

Content-Type 标头添加到您的响应中,以便浏览器了解它是什么类型的数据:

return response($response)
        ->header('Content-Type', 'image/jpeg');

【讨论】:

  • 但是我仍然有一个“二进制”图像,如何在 laravel 刀片模板中使用它?因为这根本行不通:
  • @LazyAdmin 这当然行不通。您应该为 <img> 标记提供 URL,而不是原始数据(尽管有可能,但在这种情况下我不建议这样做)。因此,将src= 属性指向您的控制器以获取配置文件图像。
  • 鉴于它非常小 (48x48),您可以直接在 src 属性中使用带有 base64 编码图像的 data 标签,如下所示:(data:image/jpeg;base64, {base64-image})`。
  • 问题是我得到的数据返回如下�����JFIF�������C� $.' " ,#(7),01444'9="82<.342���C" ="" ="" 2!!22222222222222222222222222222222222222222222222222����0�0"��������������="" �������}�!1aqa"q2���#b��
【解决方案2】:

好的,终于找到了:

curl_setopt_array($curl, array(
        CURLOPT_URL => "https://graph.microsoft.com/v1.0/me/photos/48x48/\$value",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_HTTPHEADER => array(
            "authorization: Bearer $at",
            "cache-control: no-cache",
            "postman-token: 2d4b85a3-5490-3f58-ff74-52e0a98286ec"
        ),
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        return base64_encode($response);
    }

在模板中:

<img src="data:image/jpeg;base64,{{\O365\Profile::photo()}}"/>

【讨论】: