アプリでSkyDriveのアクセス
SkyDrive APIの2回目です。前回はLive Connectを利用してSkyDriveのフォルダーとファイル情報の取得を紹介しました。今回はフォルダーの作成やファイルのアップロードなどの操作を行ってみましょう。これらの操作は待ち望んでいた人も多いのではないでしょうか。
以前に提供されていたAPIでは参照だけでしたが、
ファイルのアップロード
さっそくAPIを利用してのSkyDriveへのファイルアップロードについてみてみましょう。アップロードは、
アップロードを行うには、
POSTメソッドによるアップロード
まず、
- https://
apis. live. net/ v5. 0/ me/ skydrive/ files?access_ token=ACCESS_ TOKEN
実際にサーバーへ送信するHTTPの通信内容は、
POST https://apis.live.net/v5.0/me/skydrive/files?access_token=ACCESS_TOKEN HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Content-Type: multipart/form-data; boundary=---------------------------7dc3801415811aa
Connection: Keep-Alive
Host: apis.live.net
Content-Length: 202
-----------------------------7dc3801415811aa
Content-Disposition: form-data; name="upfile"; filename="sample.txt"
Content-Type: text/plain
hogehoge
-----------------------------7dc3801415811aa--
サーバーからの応答は、
{
"id": "file.xxxxx",
"source": "http://storage.live.com/xxxxx/sample.txt:Binary"
}
単純なHTTP POSTメソッドによる投稿ですので、
アップロード先のフォルダーの指定は、
- https://
apis. live. net/ v5. 0/FOLDER_ ID /files
ファイルが同名の場合、
- 例:
- https://
apis. live. net/ v5. 0/ me/ skydrive/ files?overwrite=false&access_ token=ACCESS_ TOKEN
アクセストークンはURLに含めるだけでなく、
Authorization: Bearer ACCESS_TOKEN
PUTメソッドによるアップロード
PUTメソッドを使用した場合は、
PUT https://apis.live.net/v5.0/me/skydrive/files/sample.txt?access_token=ACCESS_TOKEN HTTP/1.1
Host: apis.live.net
Content-Length: 8
Connection: Keep-Alive
hogehoge
サーバーからの応答は、
既にSkyDrive上にあるファイルをPUTメソッドで上書きする場合は、
- https://
apis. live. net/ v5. 0/FILE_ ID /content?access_token=ACCESS_ TOKEN
以上がファイルのアップロードの基本でした。ちなみに、
PHPでファイルのアップロード
PHPでSkyDriveにファイルをアップロードするコードを書いてみましょう。特に難しいところはなく、
ここではPOSTメソッドによるコードを示します。ファイルは、
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のコードです。ファイルがアップロードされた場合、
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_
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);
}
このコードでは、
サンプルでは、
フォルダーの作成
次は、
{
name: "新しいフォルダー"
}
作成に成功すると、
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のため、
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);
}
フォルダーの作成も簡単ですね。
フォルダー・ファイル情報の変更
続いて、
情報の変更は、
{
name: "新しいフォルダー名",
description: "ほむほむ"
}
HTTPの通信内容は次のようになります。
PUT https://apis.live.net/v5.0/folder.xxxxx?access_token=ACCESS_TOKEN HTTP/1.1
Content-Type: application/json
Host: apis.live.net
Content-Length: 66
Connection: Keep-Alive
{name: "新しいフォルダー名", description: "ほむほむ"}
PHPでは次のように記述できます。
$res = update($token, 'file.xxxxx', '新しいフォルダー名', "ほむほむ");
function update($token, $path, $name, $desc) {
$data = '{name: "' . $name . '", description: "' . $desc . '"}';
$url = 'https://apis.live.net/v5.0/' . $path;
$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_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
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);
}
フォルダーの説明

前回に紹介したとおりLive ConnectでSkyDriveにアップロードできるファイルの種類は文書や写真など限定されています。ファイル名をサポートしていない拡張子のものへ変更しようとすると、
フォルダー・ファイルの削除
次は、
DELETE https://apis.live.net/v5.0/file.xxxxx?access_token=ACCESS_TOKEN HTTP/1.1
Host: apis.live.net
Connection: Keep-Alive
PHPでは次のように記述できます。
$res = delete_file($token, 'file.xxxxx');
function delete_file($token, $path) {
$url = 'https://apis.live.net/v5.0/' . $path;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: Bearer $token"));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
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);
}
SkyDriveは、
フォルダー・ファイルの移動、ファイルのコピー
フォルダーとファイルの移動や、
移動
{
destination: "folder.xxxxx"
}
移動の場合のHTTPの通信内容は次のようになります。
MOVE https://apis.live.net/v5.0/file.xxxxx?access_token=ACCESS_TOKEN HTTP/1.1
Content-Type: application/json
Host: apis.live.net
Content-Length: 60
Connection: Keep-Alive
{destination: "folder.xxxxx"}
コピーの場合、
PHPでは次のように記述できます。
$res = move($token, 'file.xxxxx', 'folder.xxxxx');
function move($token, $src, $dest) {
$data = '{destination: "' . $dest . '"}';
$url = 'https://apis.live.net/v5.0/' . $src;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER,
array("Authorization: Bearer $token",
"Content-Type: application/json"));
// (コピーの場合は MOVE を COPY に変更するとできます)
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'MOVE');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
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);
}
移動またはコピーは、
ほかのユーザーへのフォルダーやファイルの移動・
おわりに
今回はここまでです。基本的なフォルダーやファイル操作に関する内容を紹介しました。あわせてPHPの簡単なサンプルコードも紹介しました。処理している内容は単純なHTTPアクセスだけですので、
今回の内容のファイルのアップロードやフォルダーの作成などは、
次回もSkyDrive APIの続きを紹介します。最終的にはSkyDriveと連携した簡単なアプリも開発する予定です。