我在将图像发布到https://www.googleapis.com/upload/drive/v3/files?uploadType=media时遇到问题。该文件是在我的Google云端硬盘上创建的,但是jpeg的大小始终为35KB,因此似乎从未上传任何图像内容。
最初,我认为这是vue-google-api中的错误,但是现在怀疑它与Google Drive API V3有关。当我尝试将图像直接发布到API时,遇到了同样的问题。
请求
POST https://www.googleapis.com/upload/drive/v3/files?uploadType=media
Accept: */*
Accept-Encoding: gzip, deflate
Content-Type: image/jpeg
Content-Length: 26837
Accept-Language: en-ca
Authorization: Bearer ya29.Gl1pB5BN9khs33ygA9pnIbyxJYp87teqDUfm55EsEHmmPJz0...
/9j/4AAQSkZJRgABAQEASABIAAD//gAMQXBwbGVNYXJrCv/bAIQABwUFBgUFBwYGBggHBwgKEQs...
回复
HTTP/1.1 200 OK
Server: UploadServer
Content-Type: application/json; charset=UTF-8
X-GUploader-UploadID: AEnB2UrjBAKhEMI-rCdzXpfAF3rM3oBABNUVH9AnhFtoXsoRroYV3By4rVqEuU1mn_5rJ2u_msN99Z1m2r-6Lh53fAowxmQ7QGAgWr2bP6cEwfnfV9JE-Vc
Pragma: no-cache
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Vary: Origin, X-Origin
Date: Mon, 19 Aug 2019 17:04:18 GMT
Alt-Svc: quic=":443"; ma=2592000; v="46,43,39"
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Length: 118
{
"kind": "drive#file",
"id": "16dC3Fv2vKIur426INggTZ6GzDvyRUPrV",
"name": "Untitled",
"mimeType": "image/jpeg"
}
有人能成功将图像上传到Google Drive API V3吗?知道有什么问题吗?
答案 0 :(得分:1)
此修改如何?关于uploadType=media
,无法包含元数据,我找不到上载和转换base64数据的方法。当我在您的问题中看到the link时,我注意到您尝试了2种方法。一个是uploadType=media
。另一个是uploadType=multipart
。在链接上,我还确认这两个脚本均无效。
uploadType=multipart
可以上传base64数据并将其转换为二进制数据。因此,在这里,我想提出对uploadType=multipart
的修改。
我认为您的请求正文几乎是正确的。但是需要对其进行一些修改。
Content-Transfer-Encoding
设置为请求正文。Content-Length
,也可以上传文件。请如下修改contentDisposition()
。
body += "--" + boundary
+ "\r\nContent-Disposition: form-data; name=" + key
+ "\r\nContent-type: " + formData[key].type
+ "\r\n\r\n" + formData[key].value + "\r\n";
至:
body += "--" + boundary
+ "\r\nContent-Disposition: form-data; name=" + key
+ "\r\nContent-type: " + formData[key].type
+ (key == "file" ? "\r\nContent-Transfer-Encoding: base64" : "") // Added
+ "\r\n\r\n" + formData[key].value + "\r\n";
然后,请按如下所示修改uploadGoogleMultipart()
。
headers: {
"Content-Type": "multipart/related; boundary=" + boundary,
'Content-Length': body.length
},
至:
headers: {
"Content-Type": "multipart/related; boundary=" + boundary,
},
如果我误解了您的问题,而这不是您想要的方向,我深表歉意。
答案 1 :(得分:0)
经过数小时的梳理和观察相同的答案。对我唯一有用的是将多部分请求(该Google文档)更改为使用FormData。
贷记此answer。
const metadata = JSON.stringify({
name: myFile.name,
mimeType: myFile.type,
});
const requestData = new FormData();
requestData.append("metadata", new Blob([metadata], {
type: "application/json"
}));
requestData.append("file", items[0].file);
const xhr = new XMLHttpRequest();
xhr.open("POST", "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart");
const token = gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse().access_token;
xhr.setRequestHeader("Authorization", `Bearer ${token}`);
xhr.send(requestData);