使ってみよう! Windows Live SDK/API

第49回 SkyDrive API 概要(2)──ファイルのアップロードほか

この記事を読むのに必要な時間:およそ 6.5 分

PHPでファイルのアップロード

PHPでSkyDriveにファイルをアップロードするコードを書いてみましょう。特に難しいところはなく,単純なHTTPアクセスを行うプログラムです。アクセストークンを取得する部分は省略していますので,前回のコードと併せて確認してください。

ここではPOSTメソッドによるコードを示します。ファイルは,PHPの動いているWebサーバー上に一度アップロードしてから,Live ConnectでSkyDriveにアップロードします。

HTML部分は次のようにファイルをアップロードするフォームを用意します。また,エラーなどのメッセージを表示する領域も用意しておきます。

<form action="49.php" method="POST" enctype="multipart/form-data">
  <div>
    SkyDrive へファイルをアップロードします。<br />
    <input type="file" name="upfile" size="30" />
      <input type="submit" value="アップロード" />
  </div>
</form>
<div class="message"><?php echo $msg; ?></div>

次はPHPのコードです。ファイルがアップロードされた場合,一時的にファイルを保存して,SkyDriveへさらにアップロードします。アクセストークン(このコードでは$tokenに格納されているものとします)を得られている場合にのみ,以下の処理を実行するようにします。

if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
  // 一時保存ディレクトリ
  $dir = "./tmp/";

  // ファイル名を新しく付ける
  $tmp = $_FILES["upfile"]["name"];
  $file = uniqid('', true) . substr($tmp, strrpos($tmp, '.'));

  if (move_uploaded_file($_FILES["upfile"]["tmp_name"], $dir . $file)) {
      // アップロードされたファイルを一時保存先へ移動し,成功した場合

      // SkyDrive へアップロード
      $res = upload_to_skydrive($token, $dir . $file);
      if ($res === false) {
          $msg = "Error";
      } else if (array_key_exists('error', $res)) {
          // エラーメッセージが返ってきた場合
          $msg = htmlspecialchars($res['error']['message'], ENT_QUOTES, 'UTF-8');
      } else {
          // アップロード成功が成功した場合
          $msg = 'アップロード完了: <a href="' . $res['source'] . '">' . htmlspecialchars($file, ENT_QUOTES, 'UTF-8') . '</a>';
      }

      // 一時ファイル削除
      @unlink($dir . $file);
  } else {
      $msg = 'アップロード失敗';
  }
}

上記コードで呼び出しているupload_to_skydrive関数は,次のようになります。関数には,アクセストークンと一時的に保存したファイルのパスを渡します。主な処理内容は,ファイルをPOSTメソッドで送信しているだけです。

function upload_to_skydrive($token, $file) {
    $url = 'https://apis.live.net/v5.0/me/skydrive/files';
    $data = array("file" => "@" . realpath($file));
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: Bearer $token"));
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // (サーバー証明書を検証しない)
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    
    // エラーの場合 false を返す
    $res = curl_exec($ch);
    if ($no = curl_errno($ch)) {
        echo $no;
        return false;
    }
    curl_close($ch);
    return json_decode($res, true);
}

このコードでは,SkyDrive直下にのみアップロードを行います。アクセスするURLにFolderオブジェクトのidを指定するように変更すれば,指定したフォルダーにアップロードできるようになります。

サンプルでは,前回のOAuth部分のコードと組み合わせたコードを公開しています。

フォルダーの作成

次は,フォルダーを作ってみましょう。フォルダーを作成するには,フォルダー名を次のようなJSONデータで表し,フォルダーを示すURLへHTTP POSTメソッドで送信します。

{
    name: "新しいフォルダー"
}

作成に成功すると,Folderオブジェクトが返ってきます。既にある場合はエラーメッセージが返ります。

HTTPの通信内容は次のようになります。

POST https://apis.live.net/v5.0/me/skydrive?access_token=ACCESS_TOKEN HTTP/1.1
Content-Type: application/json
Host: apis.live.net
Content-Length: 34
Connection: Keep-Alive

{name: "新しいフォルダー"}

JSONのため,Content-Typeは「application/json」を指定します。

PHPで記述した場合は,次のように書けます。

$res = create_folder($token, 'me/skydrive', '新しいフォルダー');

function create_folder($token, $path, $name) {
    $url = 'https://apis.live.net/v5.0/' . $path;
    $data = '{name: "' . $name . '"}';

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, 
        array("Authorization: Bearer $token", 
              "Content-Type: application/json"));

    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    
    $res = curl_exec($ch);
    if ($no = curl_errno($ch)) {
        return false;
    }
    curl_close($ch);
    echo $res;
    return json_decode($res, true);
}

フォルダーの作成も簡単ですね。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp