将图像发布到Google Drive API V3时出现问题

时间:2019-08-19 17:14:22

标签: google-drive-api

我在将图像发布到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吗?知道有什么问题吗?

2 个答案:

答案 0 :(得分:1)

此修改如何?关于uploadType=media,无法包含元数据,我找不到上载和转换base64数据的方法。当我在您的问题中看到the link时,我注意到您尝试了2种方法。一个是uploadType=media。另一个是uploadType=multipart。在链接上,我还确认这两个脚本均无效。

uploadType=multipart可以上传base64数据并将其转换为二进制数据。因此,在这里,我想提出对uploadType=multipart的修改。

修改点:

我认为您的请求正文几乎是正确的。但是需要对其进行一些修改。

  • 在您的问题中,您说过数据已转换为base64。在这种情况下,必须将Content-Transfer-Encoding设置为请求正文。
  • 将文件上传到Google云端硬盘时,即使未设置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,
},

注意:

  • 在此修改中,它假设您已经能够使用Drive API将文件上传到Google Drive。

参考:

如果我误解了您的问题,而这不是您想要的方向,我深表歉意。

答案 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);