更新:这是 GoogleDrive 中的一个错误,没有为上传 URI 启用 CORS。@Nivco 向我指出了使用 iframe 和代理(不是 CORS)的 Google 客户端库的解决方法。我将(经过测试的)工作代码放在底部,并附有详细说明。请参阅下面的示例的答案。
Inserting File to Google Drive through API and Authorization of Google Drive using JavaScript说上传端点支持CORS,但我一直无法使用它们。我可以使用Files: insert获得授权并插入一个空文件,但我无法将内容上传到其中 - 使用https://www.googleapis.com/upload时出现 405(不允许的方法)错误/drive/v2/files当我使用插入文件堆栈溢出帖子中示例中给出的两种技术中的任何一种时。
CORS 是否可能适用于 v1 而尚未启用 v2?
编辑:顺便说一句,405 错误出现在 chrome 正在发出的 OPTIONS 请求中。
编辑:这是我的一次尝试中的代码:
在我展示代码之前,我想强调一下我能够验证和列出文件。我只是无法将数据上传到文件。
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 错误。没有 POST,因为 Chrome 无法继续,因为它的 OPTIONS 请求以 405 失败,因此它在控制台中打印此错误:
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.