DevelopmentWeb Service

[OneDrive API] ネット上のファイルを OneDrive に保存

2015/2 に公開された新しい OneDrive API では、ファイルのアップロード方法が追加され、指定した URL のファイルを OneDrive にアップロード(保存)できます。※ 3/14 時点では Preview 機能です。

これまでのようにファイルのバイトデータを HTTP PUT する必要がなく、簡単に OneDrive にファイルを保存できます。Web アプリでは活用できそうな機能ですね。

さっそく、JavaScript サンプル を元に、コードを書いてみました。

認証後に実行される onAuthenticated 部分を書き換えています。

index.html
<script>

// (省略)

function onAuthenticated(token, authWindow) {
    if (token) {
        if (authWindow) {
            removeLoginButton();
            authWindow.close();
        }

        (function ($) {
            // Upload an item to OneDrive from a URL  
            $.ajax({
                url: 'https://api.onedrive.com/v1.0/drive/special/photos/children?access_token=' + token,
                type: 'POST',
                headers: {
                    'Prefer': 'respond-async',
                    'Content-Type': 'application/json'
                },
                dataType: 'json',
                data: '{' +
                        '"@content.sourceUrl": "https://pronama.jp/wp-content/uploads/2015/02/20150206.jpg",' +
                        '"name": "20150206.jpg",' +
                        '"file": { }' +
                        '}',
            }).done(function () {
                // MEMO: unreachable  (2015/3/14)
                console.log("success");
            }).fail(function (xhr, textStatus, errorThrown) {
                console.log(xhr);
            });
        })(jQuery);
    }
    else {
        alert("Error signing in");
    }
}

// start the whole thing off by calling odauth() in non-click mode.
// if the user isn't logged in already, a sign-in link will appear
// for them to click.
odauth();
</script>

コードでは、アップロード先は、Photos フォルダー (/drive/special/photos/) とし、URL と保存ファイル名は、直接記述しています。

API 詳細は、Upload an item to OneDrive from a URL (Preview) 参照。HTTP リクエストは POST メソッドで、Prefer Header の値に respond-async を指定する必要があります。

不具合と思われる現象

  • アップロード成功時も done() が実行されない。レスポンスの JSON がパースできず fail() が実行されるようです。
  • アップロードしたファイルを削除すると、同名のファイルをアップロードできない(HTTP レスポンスは 202 だが、ファイルがフォルダーに作成されていない)。同じコードで繰り返し動作確認しようとしたらできませんでした。