SkyDriveに画像をアップロードする


SkyDriveからデータを取得する(1.認証情報とルートディレクトリの取得)SkyDriveからデータを取得する(2.ファイルの取得)ではSkyDriveのディレクトリを参照したりファイルを取得したりする方法を紹介しました。

今回はSkyDriveに画像をアップロードする方法を紹介します。

カメラアプリや画像編集系のソフトでユーザーデータをSkyDriveにアップロードすることで、アプリで作成された画像をを他のユーザーと共有したり、PCへ簡単に保存したりすることができるため、ユーザーから喜ばれるアプリとなるはずです。

詳細は以下から。

SkyDriveへ画像をアップロードするためには以下の手順が必要になります。

  1. Windows Live認証を実装する
  2. アップロードするSkyDrive上のディレクトリのidを取得する
  3. アップロードを行う

Windows Live認証を実装する

SkyDriveはWindows Liveファミリーのサービスであるため、Windows Liveにログインする必要があります。

基本的にはSkyDriveからデータを取得する(1.認証情報とルートディレクトリの取得)を参考にsignInButtonを実装するだけでいいのですが、この記事内ではファイルとディレクトリの参照を行う権限しか付与していないため、Scopes属性にwl.skydrive_updateというSkyDrive上のデータを編集する権限を付与する必要があります。

下記はディレクトリの参照を行いながらアップロードを行うためのsignInButtonの記述になります。

<my:SignInButton Content="Button" Height="72" HorizontalAlignment="Left"
 Margin="85,239,0,0" Name="signInButton1" VerticalAlignment="Top" Width="304"
 ClientId="アプリのID" SessionChanged="signInButton1_SessionChanged"
 Scopes="wl.basic wl.signin wl.signin wl.skydrive wl.photos wl.skydrive_update" />

アップロードするSkyDrive上のディレクトリのidを取得する

下記はSkyDriveからデータを取得する(2.ファイルの取得)を参考に/photosフォルダのidを取得するサンプルです。

private LiveConnectSession session;
private LiveConnectClient filesClient;

private void signInButton1_SessionChanged(object sender, Microsoft.Live.Controls.LiveConnectSessionChangedEventArgs e)
{
    if (e.Session != null)
    {
        session = e.Session;
        filesClient = new LiveConnectClient(session);
        filesClient.GetCompleted += new EventHandler<LiveOperationCompletedEventArgs>(filesClient_GetCompleted);
        filesClient.GetAsync("/me/skydrive/files");
    }
}

void filesClient_GetCompleted(object sender, LiveOperationCompletedEventArgs e)
{
    if (e.Error == null)
    {
        List<object> data = (List<object>)e.Result["data"];
        foreach (IDictionary<string, object> files in data)
        {
            if (files.ContainsKey("name") && files["name"] != null)
            {
                if (files["name"].ToString() == "photo")
                {
                    String forID = files["name"].ToString();
                    // ここにアップロード用の処理を記述
                }

            }
        }
    }
}

26行目の箇所で/photosフォルダのIDを取得することができるため、ここにアップロードの処理を記述していきます。

アップロードを行う

ではいよいよアップロードを行う部分を解説します。

アップロードを行うにはLiveConnectClientクラスのUploadAsyncメソッドを使用します。
UploadAsyncメソッドの引数には以下の内容のデータを渡す必要があります。

[table “260” not found /]

また、アップロードが完了した後に処理を行いたい場合はLiveConnectClientクラスのUploadCompletedプロパティにイベントハンドラを登録する必要があります。

下記は”/photos”フォルダにカメラロールの”1.jpg”という名前のファイルをアップロードするサンプルです。

アップロードするSkyDrive上のディレクトリのidを取得するのコード内の”// ここにアップロード用の処理を記述”部分に記述するコードです。

                    using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication())
                    {
                        string loadFileName = "1.jpg";
                        using (var library = new MediaLibrary())
                        {
                            // 保存してある画像ファイルを全て取得
                            PictureCollection pictures = library.Pictures;
                            IEnumerator<Picture> enumerator = pictures.GetEnumerator();
                            while (enumerator.MoveNext())
                            {
                                // 画像ファイル名が存在したらアップロードを開始する
                                if (loadFileName.Equals(enumerator.Current.Name))
                                {
                                    filesClient.UploadCompleted += new EventHandler<LiveOperationCompletedEventArgs>(File_UploadCompleted);
                                    filesClient.UploadAsync("/" + files["id"].ToString(), "1.jpg", enumerator.Current.GetImage());
                                }
                            }
                        }
                    }

1行目と4行目にusingという見慣れない記述があります。
これはusingステートメントと呼ばれるもので、( )内に記述された処理を実行した際に例外が発生しなければ{ }内の処理を実行する機能です。
( )内の処理で例外が発生した場合は自動的に安全な処理の終了を行なってくれます。

7~12行目は端末に保存されている画像から特定の画像を取得するための処理です。
この記事ではアップロードを紹介するため、詳細は別の機会に紹介しますので今回は割愛します。

15行目でアップロード処理を行なっています。
UploadAsyncメソッドの第一引数に“/【アップロード先のフォルダのID】”を指定することでアップロードを行なっています。

14行目ではUploadCompletedプロパティにアップロード完了後の処理を関連付けています。
EventHandlerのコンストラクタの引数に渡しているFile_UploadCompletedはユーザー定義メソッドで、今回は下記のように実装してみましょう。

void File_UploadCompleted(Object sender, LiveOperationCompletedEventArgs live)
{
    if (live.Error == null)
    {
        textBlock1.Text = "OK";
    }
    else
    {
        textBlock1.Text = live.Error.Message;
    }
}

エラーが発生しなければTextBlockに”OK”と表示し、エラーが発生すればエラー内容をTextBlockに出力するだけの簡単な実装です。
LiveOperationCompletedEventArgsクラスのError.Messageプロパティにエラー内容が格納されています。

エミュレータは画像を保存できるアプリが入っていないため、本記事のサンプルをエミュレータで動かす場合はカメラを使ってみようのサンプルで写真を撮影して、撮影したデータを使用することをおすすめします。