更新:これは GoogleDrive のバグです。アップロード URI に対して CORS が有効になっていません。@Nivco は、iframe とプロキシ (CORS ではない) を使用する Google のクライアント ライブラリの回避策を教えてくれました。詳細な説明とともに、(テスト済みの) 動作コードを一番下に置きます。例については、以下の回答を参照してください。
Inserting File to Google Drive through APIとAuthorization of Google Drive using JavaScriptは、アップロード エンドポイントが CORS をサポートしていると言っていますが、私はそれらを使用できませんでした。Files: insertを使用して承認を取得し、空のファイルを挿入できますが、コンテンツをアップロードできません。https://www.googleapis.com/uploadを使用すると、405 (メソッドが許可されていません) エラーが発生します。 /drive/v2/filesは、ファイル スタック オーバーフローの挿入の投稿の例に示されている 2 つの手法のいずれかを使用した場合です。
CORS が v1 で機能し、v2 で有効になっていない可能性はありますか?
EDIT:ちなみに、405エラーはchromeが作成しているOPTIONSリクエストにあります。
編集:これが私の試みの1つからのコードです:
コードを提示する前に、ファイルを認証して一覧表示できることを強調したいと思います。ファイルにデータをアップロードできません。
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart');
xhr.setRequestHeader('Authorization', 'Bearer ' + params.access_token);
xhr.setRequestHeader("Content-Type", 'multipart/related; boundary="END_OF_PART"');
xhr.onreadystatechange = function(data) {
if (xhr.readyState == DONE) {
document.getElementById("files").innerHTML = "Uploaded file: " + xhr.responseText;
};
}
xhr.send([
mimePart("END_OF_PART", "application/json", json),
mimePart("END_OF_PART", "text/plain", "a\nb\n"),
"\r\n--END_OF_PART--\r\n",
].join(''));
function mimePart(boundary, mimeType, content) {
return [
"\r\n--", boundary, "\r\n",
"Content-Type: ", mimeType, "\r\n",
"Content-Length: ", content.length, "\r\n",
"\r\n",
content,
].join('');
}
リクエストは次のとおりです。
Request URL:https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart
Request Method:OPTIONS
応答は次のとおりです。
Status Code:405 Method Not Allowed
cache-control:no-cache, no-store, must-revalidate
content-length:0
content-type:text/html; charset=UTF-8
date:Mon, 23 Jul 2012 22:41:29 GMT
expires:Fri, 01 Jan 1990 00:00:00 GMT
pragma:no-cache
server:HTTP Upload Server Built on Jul 17 2012 16:15:04 (1342566904)
status:405 Method Not Allowed
version:HTTP/1.1
Chrome はその OPTIONS リクエストに対して 405 エラーを受け取るため、応答はありません。OPTIONS リクエストが 405 で失敗したため、Chrome が続行できないため、POST はありません。コンソールに次のエラーが出力されます。
XMLHttpRequest cannot load https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart. Origin https://leisurestorage.appspot.com is not allowed by Access-Control-Allow-Origin.