YouTube API を使用してブラウザベースのアップロードを実行しようとしていますが、プログレス バーを表示するために Ajax も使用しています。
ここから始めました: https://developers.google.com/youtube/2.0/developers_guide_protocol_browser_based_uploading
基本的な HTML フォーム ポストを使用するだけで 100% 機能します。
<form id="frmYouTube" enctype="multipart/form-data" method="post" action="https://uploads.gdata.youtube.com/action/FormDataUpload/YOUTUBE_URL_HERE?nexturl=https%3a%2f%2fdomain%2fpageafter%2fVideoUploadDone%3fid2%3dLOCAL_ID">
<table>
<tr>
<td><input type="file" name="file" /></td>
</tr>
<tr>
<td>
<input type="hidden" name="token" value="YOUTUBE_TOKEN_HERE" />
<input type="submit" value="Upload" />
</td>
</tr>
</table>
</form>
ただし、Javascript を追加しようとすると、問題が発生します。MooTools とhttp://mootools.net/forge/p/form_uploadの Request.File クラスも含めています。
コードの簡略版は次のとおりです。
var yt = $('frmYouTube');
var ytDone = function () {
// Code to display: 'Video upload complete. Return to <a href="/Acount">your account</a>.';
};
var ytProgress = function (event, xhr) {
var loaded = event.loaded, total = event.total;
// Code to display: 'Uploading... ' + (parseInt(loaded / total * 100, 10)) + '%';
};
yt.addEvents({ 'submit': function (ev) {
ev.stop();
var rf = new Request.File({
url: yt.get('action'),
onProgress: ytProgress,
onFailure: function (xhr) {
ytError('Upload Failed (1).');
},
onCancel: function () {
ytError('Upload Canceled.');
},
onException: function () {
ytError('Upload Failed (2).');
},
onSuccess: ytDone
});
yt.getElements('input').each(function (field) {
if (field.files) {
rf.append(field.get('name'), field.files[0]);
} else {
rf.append(field.get('name'), field.get('value'));
}
});
rf.send();
}
});
</script>
この時点で、ファイルは正常にアップロードされ、YouTube は「nexturl」への 302 リダイレクトを返しますが、クロスオリジン ルールのため、リダイレクトに従わず、Javascript を使用してロケーション ヘッダーにアクセスできません。
iframe を使用するソリューションをいくつか見てきましたが、プログレス バーが必要な場合は機能しません。YouTube へのブラウザ ベースのアップロードを行い、プログレス バーを表示するための回避策を思いついた人はいますか?