PHP で OneDrive の REST API を利用してファイルをアップロードする方法調べたので、忘れないように書いておこう!
前回の OAuth のあたりと同じように OneDrive へ OAuth承認して貰い、コールバック関数などでファイルをアップロードする方法がなんとかわかったので、忘れる前に書いておこう!
<?php
define('CLIENT_ID', '000000004C1XXXXX');
define('CALLBACK', 'http://bbz.jp/onedrive/callback.php');
$baseURL = 'https://login.live.com/oauth20_authorize.srf?';
// 認証用URL生成
$params = array(
'client_id' => CLIENT_ID,
'scope' => 'onedrive.readwrite onedrive.appfolder' ,
'response_type' =>'code',
'redirect_uri' => CALLBACK ,
);
$authURL = $baseURL . http_build_query($params,'','&',PHP_QUERY_RFC3986);//.'&redirect_uri='.CALLBACK;
// Redirect
header("Location: " . $authURL);
?>
まあ、コッチはそんなに問題ない
スコープかな..
コールバック側
アクセストークンとリフレッシュトークンのあたりも、この前とほぼ同じでいける
Simple item upload to OneDrive using PUT
コンテンツ中にファイルをそのまま記載する方法
$content = "\r\n\r\nHello World\r\n";
$headers = array(
// 'Content-Type: application/form-data',
'Content-Type: text/plain',
'Authorization: Bearer '.$tokens['access_token'],
'X-Api-Key: '.CLIENT_ID,
'locale: ja_JP',
// 'Content-Length: '.strlen(http_build_query($params)),
'Content-Length: '.strlen($content),
);
$options = array(
'http'=> array(
'method' => 'PUT',
'ignore_errors' => true,
// 'content' => http_build_query($params),
'content' => $content,
'header' => implode("\r\n",$headers),
)
);
$res = file_get_contents($URL, false,stream_context_create($options));
$content にかいてある Hello World と言うテキストのテキストファイルを書き込みます
このコールは
$apiURL = 'https://api.onedrive.com/v1.0/';
$URL = $apiURL.'drive/items/XXXXX5FD11791F83!XXX/children/test.txt/content';
です
XXXXX5FD11791F83!XXX はディレクトリーです
取り込む方法は別途!
簡単に確認する方法は、ブラウザーで OneDrive にアックセスしたときの URI を確認する
/root に各方法などもある
items の説明は
item resource
この方式は 100MB 迄いけるそうです
この仕様でもいけそうな気がするけど、 URL で指定したファイルを取り込む機能があるらしいので、試してみた
で、今回は、コッチの API でいけそうな気がする
OneDrive の Personal 版だけ使えるようです
$content =
"\r\n{
\"@content.sourceUrl\": \"http://bbz.jp/onedrive/central_p6.jpg\",
\"name\": \"central_p5.jpg\",
\"file\": {}
}\r\n";
$headers = array(
'Content-Type: application/json',
'Prefer: respond-async',
'Authorization: Bearer '.$tokens['access_token'],
'X-Api-Key: '.CLIENT_ID,
'locale: ja_JP',
// 'Content-Length: '.strlen(http_build_query($params)),
'Content-Length: '.strlen($content),
);
$options = array(
'http'=> array(
'method' => 'POST',
'ignore_errors' => true,
// 'content' => http_build_query($params),
// 'content' => json_encode($params),
'content' => $content,
'header' => implode("\r\n",$headers),
)
);
$res = file_get_contents($URL, false,stream_context_create($options));
これを実行すると、http://bbz.jp/onedrive/central_p6.jpg
が
$URL = $apiURL.'drive/items/XXXXX5FD11791F83!XXX/children';
この item で指定したフォルダーへ central_p6.jpg
がコピーされます
成功すると HTTP/1.1 202 Accepted が帰ってきます
コールを間違えると 400,とかが帰ってきます
エラーコード一覧
未完