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