こんにちは。株式会社リンクネット、ソリューション事業部の森正です。
ファイル管理システムを作るにあたり、システムからSharePointを操作する必要がありました。
SharePointを操作するするためにMicrosoftGraphApiを使用したので、使用方法についてまとめておこうと思います。
$ sail artisan -V
Laravel Framework 11.0.7
$ sail php -v
PHP 8.3.4 (cli) (built: Mar 16 2024 08:40:08) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.4, Copyright (c) Zend Technologies
with Zend OPcache v8.3.4, Copyright (c), by Zend Technologies
with Xdebug v3.3.1, Copyright (c) 2002-2023, by Derick Rethans
※この記事では省略しますが、事前にSharePointでアプリの作成とアクセス許可の追加をしておく必要があります。
アプリの作成・アクセス許可の追加方法についてはこちらを参考にしてください。
composerを使用してインストールします。
$ sail composer require microsoft/microsoft-graph
.envにSharePointで作成したアプリの情報を設定します。
CLIENT_ID= // アプリケーション(クライアント)ID
CLIENT_SECRET= // クライアントシークレット
TENANT_ID= // ディレクトリ(テナント)ID
'microsoft' => [
'client_id' => env('CLIENT_ID', null),
'client_secret' => env('CLIENT_SECRET', null),
'tenant_id' => env('TENANT_ID', null),
]
.envのアプリ設定情報を取得し、「GraphServiceClient」と「ClientCredentialContext」 を初期化します。
・ClientCredentialContext:認証に使用
・GraphServiceClient:Microsoft Graphの呼び出しに使用
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Microsoft\Graph\GraphServiceClient;
use Microsoft\Kiota\Authentication\Oauth\ClientCredentialContext;
class HogeController extends Controller
{
private $client_id = null;
private $client_secret = null;
private $tenant_id = null;
private $scope = 'https://graph.microsoft.com/.default';
private ClientCredentialContext $tokenContext;
private GraphServiceClient $appClient;
public function __construct()
{
// アプリ情報取得
$microsoft_keys = config('env.microsoft');
$this->client_id = $microsoft_keys['client_id'];
$this->client_secret = $microsoft_keys['client_secret'];
$this->tenant_id = $microsoft_keys['tenant_id'];
// 初期化
$this->tokenContext = new ClientCredentialContext($this->tenant_id, $this->client_id, $this->client_secret);
$this->appClient = new GraphServiceClient($this->tokenContext, [$this->scope]);
}
}
ここまででMicrosoftGraphAPIを使用する準備が整ったので、SharePointを操作してみます。
今回は検証用にrootディレクトリ以下に「engineer-blog」ディレクトリを用意しました。
byDriveItemId()にrootディレクトからのパスを指定します。
$path = 'root:/engineer-blog:';
$dirs = $this->appClient->drives()->byDriveId({"ドライブID"})->items()->byDriveItemId($path)->children()->get()->wait();
$items = $dirs?->getValue();
取得結果をdd()
で確認してみます。
※今回は取得した各アイテムの情報からファイル名だけを抜き出しています。
$dir_names = [];
foreach ($items as $item) {
$dir_names[] = $item->getName();
}
dd($dir_names);
指定したディレクトリ(engineer-blog)内のアイテムが全て取得できました。
array:3 [▼
0 => "sample1.xlsx"
1 => "sample2.xlsx"
2 => "sample3.xlsx"
]
byDriveItemId()にrootディレクトからの開きたいファイルまでのパスを指定します。
use Microsoft\Graph\Generated\Drives\Item\Items\Item\CreateLink\CreateLinkPostRequestBody as CreateLinkCreateLinkPostRequestBody;
$requestBody = new CreateLinkCreateLinkPostRequestBody();
$requestBody->setType('edit'); // 参照のみにしたい場合は'view'
$requestBody->setScope('organization');
$requestBody->setRetainInheritedPermissions(false);
$path = 'root:/engineer-blog/sample1.xlsx:';
$result = $this->appClient->drives()->byDriveId({"ドライブID"})->items()->byDriveItemId($path)->createLink()->post($requestBody)->wait();
$url = $result?->getLink()->getWebUrl();
return redirect()->away($url);
web上で「sample1.xlsx」ファイルが開かれました。
setType('edit')
を指定している場合はここで直接編集が可能です。
一度ストレージ等に保存し、そこからダウンロードします。
$path = 'root:/engineer-blog/sample1.xlsx:';
$result = $this->appClient->drives()->byDriveId({"ドライブID"})->items()->byDriveItemId($path)->content()->get()->wait();
Storage::put("保存先", $result);
return Storage::download("保存元");
ドキュメント通りダウンロードする場合は上記の方法になりますが、
下記のようにダウンロードURLを取得することでも同様にダウンロードが可能です。
$path = 'root:/engineer-blog/sample1.xlsx:';
$result = $this->appClient->drives()->byDriveId({"ドライブID"})->items()->byDriveItemId($path)->get()->wait();
$url = $result?->getAdditionalData()['@microsoft.graph.downloadUrl'];
return redirect()->away($url);
「sample1.xlsx」ファイルがダウンロードされました。
「sample4.xlsx」ファイルをアップロードしてみます。
※このAPIは250MB以上のファイルはアップロードできないため、250MB以上のファイルをアップロードする場合はこちらのAPIを使用する必要があります。
$path = 'root:/engineer-blog/sample4.xlsx:';
$file = \GuzzleHttp\Psr7\Utils::streamFor(fopen($request->file, 'r'));
$this->appClient->drives()->byDriveId({"ドライブID"})->items()->byDriveItemId($path)->content()->put($file)->wait();
「sample4.xlsx」ファイルがアップロードされました。
今回はLaravelで「Microsoft Graph API」を使用しましが、PHPであればLaravel以外でも同様に使用することができます。
他のエンドポイントについては、下記サイトを参考にしてください。
MicrosoftGraphAPIのドキュメント