だるろぐ

明日できることは、今日しない。

ASP.net MVC 3 で Dropbox を利用する

自家製の Wiki システムを ASP.net MVC 3 で作ってて、「リビジョン管理機能がほしいですなぁ」と思った。そこで試行錯誤したのだけど、だんだん面倒になってきた。そしたら思いついた。Dropbox に記事を保存すれば勝手にリビジョン管理してくれるんだから、そっちにバックアップ取ればいいじゃん」「そもそも Dropbox をデータベースとして使えばよくね?」というわけで、とりあえず Dropbox を使うところから始めてみた。

準備

まず、アプリケーションの作成。

f:id:daruyanagi:20120225080924p:plain

別に認証機能は要らないや。

f:id:daruyanagi:20120225080955p:plain

今回は SharpBox (http://sharpbox.codeplex.com/) を使って楽をすることにした。NuGetでさくっとインストール。

f:id:daruyanagi:20120225081131p:plain

あと、https://www2.dropbox.com/developers/apps でアプリの登録をしておくのも忘れずに。APIキーをここで取得しておく必要がある。

コード

コントローラー

まず、Homeコントローラーを作る。なぜ Home という名前なのかというと、Global.asax を書き換えるのが面倒くさいからですね。わかります。スキャフォールディングも使って楽をしましょう。

f:id:daruyanagi:20120225081310p:plain

Index メソッドを書く。とりあえず動かしているだけなのでごちゃごちゃしているけど、接続→ルートの取得→(ファイルアップロード)→ファイルの列挙 という操作をしているだけ。あとでモデルへ追いだそう。

public ActionResult Index()
{
    var storage = new CloudStorage();
    var config = CloudStorage.GetCloudConfigurationEasy(nSupportedCloudConfigurations.DropBox);

    // load a valid security token from file
    ICloudStorageAccessToken accessToken;
    using (var fs = System.IO.File.Open(
        Server.MapPath("~/App_Data/DropBoxToken"),
        System.IO.FileMode.Open,
        System.IO.FileAccess.Read,
        System.IO.FileShare.None))
    {
        accessToken = storage.DeserializeSecurityToken(fs);
    }

    // open the connection
    var storageToken = storage.Open(config, accessToken);

    // get the root entry of the cloud storage 
    ICloudDirectoryEntry root = storage.GetRoot();
    if (root == null)
    {
        throw new Exception("ルートあらへん。");
    }

    // Upload file
    if (root.Length == 0)
    {
        storage.UploadFile(Server.MapPath("~/App_Data/Home.md"), root);
    }

    // Enum files
    var model = new List<ICloudFileSystemEntry>();
    foreach (ICloudFileSystemEntry entry in root)
    {
        // フィルタリングとか。あ、Linq使えばよかった
        model.Add(entry);
    }

    // close the cloud storage connection
    if (storage.IsOpened)
    {
        storage.Close();
    }

    return View(model);
}

トークンファイルの作成

言い忘れていたが、 /App_Data/DropBoxToken は、SharpBox に付属のツールで作成する。(プロジェクトフォルダ)\packages\AppLimit.CloudComputing.SharpBox.1.2.0.542\lib\net40-full にあるので探してみよう。これがわからなくてだいぶググった。じゃなくてビングった。SharpBox 1.2 から認証周りがだいぶ変わっていて、サンプル読んでいるとダマされるので注意。

f:id:daruyanagi:20120225081949p:plain

できたファイルは App_Data に突っ込んでおいた。あまり自信はないけど、APS.net の作法ではこれでいい気がする。ついでにファイルが何もない場合にアップロードする初期ファイル(Home.md)も、ここに用意しておいた。

ビュー

Home/Index のビューを作成する。Index メソッドのコンテキストメニューから簡単に作成できる。

@model List<AppLimit.CloudComputing.SharpBox.ICloudFileSystemEntry>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
<ul>
@foreach (var i in Model)
{
    <li>@i.Name (@i.Modified)</li>
}
</ul>

[F5]!

無事動いているみたい。

f:id:daruyanagi:20120225082122p:plain

ローカルの Dropbox にもアップロードしたファイルが現れた。

f:id:daruyanagi:20120225082309p:plain

Thanks!

ほとんどここを参照したので、みんなも見てみればいいと思うよ。 → Unboxing Dropbox and SharpBox | Jayway Team Blog - Sharing Experience