OneDrive へファイルをアップロードする方法(書きかけ)

この記事は公開されてから時間が経っています

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,とかが帰ってきます
エラーコード一覧

未完

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。