1

我尝试上传我在另一台服务器上的 URL 中的照片,但它对我不起作用,或者我不知道如何上传在这种情况下我要上传照片,但我也想上传文件将上传到该 URL。

const img = await fetch("http://example.com/api/photo")

await gapi.client.drive.files.create({
  resource: {
    name: "New Folder",
    body: img,
  }
})
4

2 回答 2

1

简单的答案是你不能那样做。上传的文件必须以流的形式发送

将文件下载到您自己的机器上,然后从那里上传。或者尝试弄清楚如何将您的网址转换为流。

var fileMetadata = {
  'name': 'photo.jpg'
};
var media = {
  mimeType: 'image/jpeg',
  body: fs.createReadStream('files/photo.jpg')
};
drive.files.create({
  resource: fileMetadata,
  media: media,
  fields: 'id'
}, function (err, file) {
  if (err) {
    // Handle error
    console.error(err);
  } else {
    console.log('File Id: ', file.id);
  }
});
于 2020-12-14T13:47:12.090 回答
1

我相信你的目标如下。

  • 您想从 URL 下载图像数据,并将下载的图像数据上传到 Google Drive。
    • 从您的脚本中,图像数据由const img = await fetch("http://example.com/api/photo").
  • 您想使用googleapis for Javascript来实现这一点。

修改点:

  • 在这种情况下,它从 中检索图像数据的 Blob fetch,并将该 Blob 上传到 Google Drive。
  • 不幸的是,在当前阶段,虽然googleapis for Javascript 可以使用元数据创建新文件,但无法包含文件内容。通过这个,在这个答案中,我使用了这个线程的方法。下载的图像数据使用fetchwith上传multipart/form-data

当以上几点反映到您的脚本时,它变成如下。

修改后的脚本:

const img = await fetch("http://example.com/api/photo").then((e) => e.blob());

const fileMetadata = {name: "sampleName"}; // Please set filename.
const form = new FormData();
form.append('metadata', new Blob([JSON.stringify(fileMetadata)], {type: 'application/json'}));
form.append('file', img);
fetch('https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart', {
  method: 'POST',
  headers: new Headers({'Authorization': 'Bearer ' + gapi.auth.getToken().access_token}),
  body: form
}).then(res => res.json()).then(res => console.log(res));
  • 通过此修改,下载的图像数据以multipart/form-data.

笔记:

  • 在本变形例中,假设如下。
    • 您的 URLhttp://example.com/api/photo是图像数据的直接链接。
    • 您的授权脚本可用于将文件上传到 Google Drive。
  • 在此答案中,作为示例脚本,该文件使用uploadType=multipart. 在这种情况下,最大文件大小为 5 MB。请注意这一点。当您要上传大尺寸文件时,请勾选可续传。参考

参考:

于 2020-12-15T00:36:36.207 回答