将图片发布到 Google 云端硬盘 API v3 时出现问题



我在将图像发布到 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"
}

有没有人能够成功地将图像上传到谷歌云端硬盘API V3?知道可能出了什么问题吗?

这个修改怎么样?大约uploadType=media,元数据无法包含,我找不到上传和转换base64数据的方法。当我看到您问题中的链接时,我注意到您已经尝试了 2 种方法。一个是uploadType=media.另一个是uploadType=multipart。在链接中,我还确认这两个脚本都不起作用。

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

修改点:

我认为您的请求正文几乎是正确的。但它需要稍微修改一下。

  • 在您的问题中,您说数据已转换为 base64。在这种情况下,需要将Content-Transfer-Encoding设置为请求正文。
  • 将文件上传到 Google 云端硬盘后,即使未设置Content-Length,也可以上传该文件。

修改后的脚本:

请按如下方式修改contentDisposition()

从:
body += "--" + boundary
+ "rnContent-Disposition: form-data; name=" + key
+ "rnContent-type: " + formData[key].type
+ "rnrn" + formData[key].value + "rn";
自:
body += "--" + boundary
+ "rnContent-Disposition: form-data; name=" + key
+ "rnContent-type: " + formData[key].type
+ (key == "file" ? "rnContent-Transfer-Encoding: base64" : "")  // Added
+ "rnrn" + formData[key].value + "rn";

并且,请按如下方式修改uploadGoogleMultipart()

从:
headers: {
"Content-Type": "multipart/related; boundary=" + boundary,
'Content-Length': body.length
},
自:
headers: {
"Content-Type": "multipart/related; boundary=" + boundary,
},

注意:

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

参考:

  • 上传文件

如果我误解了你的问题,这不是你想要的方向,我很抱歉。

经过数小时的拔头发和查看相同的答案。唯一对我有用的就是从多部分请求(Google文档(更改为使用FormData。

感谢这个答案。

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

最新更新