Как я могу загружать файлы на Google Диск, которые находятся в URL-адресе?

Я пытаюсь загрузить фотографию, которая у меня есть в URL-адресе на другом сервере, но у меня это не работает или я не знаю, как их загрузить, в этом случае я собираюсь загрузить фотографию, но я также хочу загрузить файлы, которые будет загружать по этому URL.

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

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

person Marcos Barrera    schedule 14.12.2020    source источник


Ответы (2)


Простой ответ - вы не можете этого сделать. Файл, который загружается, должен быть отправлен в виде потока.

Загрузите файл на свой компьютер, а затем загрузите его оттуда. Или попробуйте придумать, как превратить ваш URL в поток.

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);
  }
});
person DaImTo    schedule 14.12.2020
comment
Я делаю это в интерфейсе js, поэтому вместо fs я могу использовать formData или передать его в base64, верно? - person Marcos Barrera; 14.12.2020

Я считаю вашей целью следующее.

  • You want to download an image data from an URL, and want to upload the downloaded image data to Google Drive.
    • From your script, the image data is downloaded by const img = await fetch("http://example.com/api/photo").
  • Вы хотите добиться этого с помощью googleapis для Javascript.

Пункты модификации:

  • В этом случае он получает BLOB-объект данных изображения из fetch, и этот BLOB-объект загружается на Google Диск.
  • К сожалению, на текущем этапе кажется, что, хотя googleapis для Javascript может создать новый файл с метаданными, содержимое файла не может быть включено. В этом ответе я использую метод этой ветки. Загруженные данные изображения загружаются с использованием fetch с 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));
  • При этой модификации данные загруженного изображения выгружаются на Google Диск с multipart/form-data.

Примечание:

  • In this modification, it supposes as follows.
    • Your URL of http://example.com/api/photo is the direct link of the image data.
    • Ваш скрипт авторизации можно использовать для загрузки файла на Google Диск.
  • В этом ответе в качестве образца сценария файл загружается с uploadType=multipart. В этом случае максимальный размер файла составляет 5 МБ. Пожалуйста, будьте осторожны. Если вы хотите загрузить файл большого размера, проверьте возобновляемую загрузку. Ссылка

Использованная литература:

person Tanaike    schedule 15.12.2020