アプリでSkyDriveのアクセス
SkyDrive APIの2回目です。前回はLive Connectを利用してSkyDriveのフォルダーとファイル情報の取得を紹介しました。今回はフォルダーの作成やファイルのアップロードなどの操作を行ってみましょう。これらの操作は待ち望んでいた人も多いのではないでしょうか。
以前に提供されていたAPIでは参照だけでしたが、Live Connectでは、制限はあるもののアプリからSkyDriveへのファイルアップロードなどより多くのアクセスが許可され、よりWindows Liveと統合したアプリ開発ができるようになっています。
ファイルのアップロード
さっそくAPIを利用してのSkyDriveへのファイルアップロードについてみてみましょう。アップロードは、HTTPのPOSTまたはPUTメソッドで行います。
アップロードを行うには、OAuthのスコープにwl.skydrive_updateを指定して、ユーザーからの認可を得る必要があります。Live ConnectでのOAuthについてはこれまでの内容を参照してください。
POSTメソッドによるアップロード
まず、POSTメソッドによるファイルのアップロードです。以下のようなフォルダーの内容を表すURLへファイルを送信します。SkyDrive直下のフォルダーのパスの場合は、/me/skydriveでした。/filesを付けてフォルダーの内容を表します。さらにOAuthのアクセストークンを付け、次のURLへファイルをPOSTメソッドで送信するとアップロードできます。
- https://apis.live.net/v5.0/me/skydrive/files?access_token=ACCESS_TOKEN
実際にサーバーへ送信するHTTPの通信内容は、次のようなテキストです。
サーバーからの応答は、ファイルの作成に成功した場合、次のようなJSON形式のデータです。作成されたファイルのidと一時的なファイルダウンロード用のURLが含まれています。
単純なHTTP POSTメソッドによる投稿ですので、簡単ですね。各種プログラミング言語で実装してみましょう。このあとPHPでのサンプルコードを示します。
アップロード先のフォルダーの指定は、前回紹介したFolderオブジェクトのidの値を使います。URLは以下のようになります。このURLは、FolderやFileオブジェクトのupload_locationの値と同等です。
- https://apis.live.net/v5.0/FOLDER_ID/files
ファイルが同名の場合、通常は上書きされますが、クエリーにoverwriteパラメーターを付け、値にfalseを指定してアクセスすると、同名のときエラーメッセージを返すようにできます。
- 例:
- https://apis.live.net/v5.0/me/skydrive/files?overwrite=false&access_token=ACCESS_TOKEN
アクセストークンはURLに含めるだけでなく、次のようにHTTPのAuthorizationヘッダーとしての指定も可能です。これはアップロードに限った話ではありません。
PUTメソッドによるアップロード
PUTメソッドを使用した場合は、「me/skydrive/files/sample.txt」のようにファイル名をURLに付けてアクセスします。HTTPの通信で送信するデータは次のようになります。
サーバーからの応答は、POSTメソッドのときと同じです。
既にSkyDrive上にあるファイルをPUTメソッドで上書きする場合は、Fileオブジェクトのidを使います。idを指定したパスだけでは、GETメソッドと同じ結果になり上書きされません。次のように/contentを付けてアクセスすると、既にあるファイルを上書きします。
- https://apis.live.net/v5.0/FILE_ID/content?access_token=ACCESS_TOKEN
以上がファイルのアップロードの基本でした。ちなみに、アップロードしたファイルの共有状態は、アップロード先のフォルダーの共有の状態を継承するようです。公開されているフォルダーにアップロードすると、そのファイルも公開されている状態になります。また、ファイルの共有状態はAPIで変更できません。
PHPでファイルのアップロード
PHPでSkyDriveにファイルをアップロードするコードを書いてみましょう。特に難しいところはなく、単純なHTTPアクセスを行うプログラムです。アクセストークンを取得する部分は省略していますので、前回のコードと併せて確認してください。
ここではPOSTメソッドによるコードを示します。ファイルは、PHPの動いているWebサーバー上に一度アップロードしてから、Live ConnectでSkyDriveにアップロードします。
HTML部分は次のようにファイルをアップロードするフォームを用意します。また、エラーなどのメッセージを表示する領域も用意しておきます。
次はPHPのコードです。ファイルがアップロードされた場合、一時的にファイルを保存して、SkyDriveへさらにアップロードします。アクセストークン(このコードでは$tokenに格納されているものとします)を得られている場合にのみ、以下の処理を実行するようにします。
上記コードで呼び出しているupload_to_skydrive関数は、次のようになります。関数には、アクセストークンと一時的に保存したファイルのパスを渡します。主な処理内容は、ファイルをPOSTメソッドで送信しているだけです。
このコードでは、SkyDrive直下にのみアップロードを行います。アクセスするURLにFolderオブジェクトのidを指定するように変更すれば、指定したフォルダーにアップロードできるようになります。
サンプルでは、前回のOAuth部分のコードと組み合わせたコードを公開しています。
フォルダーの作成
次は、フォルダーを作ってみましょう。フォルダーを作成するには、フォルダー名を次のようなJSONデータで表し、フォルダーを示すURLへHTTP POSTメソッドで送信します。
作成に成功すると、Folderオブジェクトが返ってきます。既にある場合はエラーメッセージが返ります。
HTTPの通信内容は次のようになります。
JSONのため、Content-Typeは「application/json」を指定します。
PHPで記述した場合は、次のように書けます。
フォルダーの作成も簡単ですね。
フォルダー・ファイル情報の変更
続いて、フォルダーまたはファイルの情報の変更についてです。APIでは、名前と説明のみ変更できます。名前と説明は、Folder・Fileオブジェクトのnameとdescriptionにあたります。
情報の変更は、HTTP PUTメソッドを使用します。変更したい内容のJSONデータを次のように指定し、フォルダーまたはファイルを示すURLへアクセスします。nameとdescriptionはどちらかひとつでも構いません。
HTTPの通信内容は次のようになります。
PHPでは次のように記述できます。
フォルダーの説明(description)は、SkyDriveで図1のように表示されます。
前回に紹介したとおりLive ConnectでSkyDriveにアップロードできるファイルの種類は文書や写真など限定されています。ファイル名をサポートしていない拡張子のものへ変更しようとすると、エラーメッセージが返ります。
フォルダー・ファイルの削除
次は、フォルダーまたはファイルの削除です。フォルダー・ファイルを示すURLにHTTP DELETEメソッドでアクセスすると削除できます。HTTPの通信内容は次のようになります。
PHPでは次のように記述できます。
SkyDriveは、普通にサービスを使用していてもそうですが、一度削除したフォルダーやファイルを元に戻せません。フォルダーを削除すると、そのフォルダーに含まれるすべてのフォルダーやファイルが削除されます。削除する場合は、気を付けて行いましょう。
フォルダー・ファイルの移動、ファイルのコピー
フォルダーとファイルの移動や、ファイルのコピーにもAPIは対応しています。移動とコピーは、あまり使う機会のないHTTP MOVEメソッドとCOPYメソッドで行います。
移動(またはコピー)先のフォルダーを次のようにJSONデータで指定します。移動の場合は、対象のフォルダーまたはファイルを示すURLに、コピーの場合は、対象のファイルを示すURLにアクセスします。
移動の場合のHTTPの通信内容は次のようになります。
コピーの場合、新しいFileオブジェクトの内容が返ってきます。
PHPでは次のように記述できます。
移動またはコピーは、同じユーザー内のフォルダーに限ります。共有されているフォルダーやファイルにLive Connectではアクセスできません。また、ひとつのアクセストークンでは、ひとりのユーザーリソースにしかアクセスできないため、必然的に同じユーザー内のフォルダーとなります。
ほかのユーザーへのフォルダーやファイルの移動・コピーは、SkyDrive自体も機能を提供していませんが、Live Connectを利用したWebアプリであればそういった機能も実現できそうですね。複数のユーザーから認可を受け、Webサーバーを中継してファイルを送るような仕組みを作れば可能です。
おわりに
今回はここまでです。基本的なフォルダーやファイル操作に関する内容を紹介しました。あわせてPHPの簡単なサンプルコードも紹介しました。処理している内容は単純なHTTPアクセスだけですので、ほかの言語でも容易に実現できると思います。
今回の内容のファイルのアップロードやフォルダーの作成などは、SkyDriveのWebサイトでもちろんできる内容です。ただ、これらを使って少し工夫すると、ユーザー間のファイルコピーのようなWebサイトでは提供されていないことも可能です。このあたりが、APIの使いどころのひとつかもしれませんね。ぜひAPIを利用してアプリを開発してみてください。
次回もSkyDrive APIの続きを紹介します。最終的にはSkyDriveと連携した簡単なアプリも開発する予定です。