[OneDrive API] ネット上のファイルを OneDrive に保存
2015/2 に公開された新しい OneDrive API では、ファイルのアップロード方法が追加され、指定した URL のファイルを OneDrive にアップロード(保存)できます。※ 3/14 時点では Preview 機能です。
これまでのようにファイルのバイトデータを HTTP PUT する必要がなく、簡単に OneDrive にファイルを保存できます。Web アプリでは活用できそうな機能ですね。
さっそく、JavaScript サンプル を元に、コードを書いてみました。
認証後に実行される onAuthenticated 部分を書き換えています。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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": "http://pronama.azurewebsites.net/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 だが、ファイルがフォルダーに作成されていない)。同じコードで繰り返し動作確認しようとしたらできませんでした。