Как я могу загрузить файл на Google Диск с помощью Google Drive api?

#javascript #google-drive-api

#javascript #google-drive-api

Вопрос:

Я сделал, как в документации (https://developers.google.com/drive/api/v3/manage-uploads#http—single-request ), но это не работает:

           var fileMetadata = {
            name: e.target.files[j].name,
            parents: this.currentDirectoryId ? [this.currentDirectoryId] : []
          }
          var media = {
            mimeType: e.target.files[j].type,
            body: e.target.files[j]
          }
          window.gapi.client.drive.files.create({
            resource: fileMetadata,
            media: media,
            fields: 'id, name, mimeType, createdTime'
          }).then(res => console.log(res))
 

Файл создан, но пустой и с именем «Без названия» с mimeType «application / octet-stream»

Комментарии:

1. Если имя неверно, исправьте имя: e.target. files[j].name, есть действительно способ, которым мы можем помочь вам отладить имя, поскольку вы не включили код, который его генерирует

2. Имя сгенерировано правильно, проблема не в e.target. files[j].name/

3. Скорее всего, сама структура запроса неверна.

Ответ №1:

Проблема и обходной путь:

  • Когда я тестировал gapi.client.drive.files.create , кажется, что, хотя этот метод может создать новый файл с метаданными, содержимое файла не может быть включено. Итак, в этом ответе, чтобы загрузить файл, включив метаданные файла, я хотел бы предложить загрузить файл с multipart/form-data использованием fetch Javascript. В этом случае токен доступа извлекается с помощью gapi.auth.getToken().access_token .
  • К сожалению, из вашего скрипта я не смог понять e.target . Итак, в этом примере сценария я хотел бы предложить пример сценария для загрузки файла, который извлекается из входного тега, с метаданными.

Пример сценария:

Сторона HTML:

 <input type="file" id="files" name="file">
 

Сторона Javascript:

 const files = document.getElementById("files").files;

const file = files[0];
const fr = new FileReader();
fr.readAsArrayBuffer(file);
fr.onload = (f) => {
  const fileMetadata = {
    name: file.name,
    parents: this.currentDirectoryId ? [this.currentDirectoryId] : []  // This is from your script.
  }
  const form = new FormData();
  form.append('metadata', new Blob([JSON.stringify(fileMetadata)], {type: 'application/json'}));
  form.append('file', new Blob([new Uint8Array(f.target.result)], {type: file.type}));
  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));
};
 
  • В этом скрипте файл, полученный из input тега, загружается на Google Диск с multipart/form-data помощью .

Примечание:

  • В этом сценарии предполагается, что ваш сценарий авторизации может использоваться для загрузки файла на Google Диск. Пожалуйста, будьте осторожны с этим.
  • В этом ответе, в качестве примера сценария, файл загружается с uploadType=multipart помощью . В этом случае максимальный размер файла составляет 5 МБ. Пожалуйста, будьте осторожны с этим. Если вы хотите загрузить файл большого размера, пожалуйста, проверьте возможность возобновления загрузки. Ссылка

Ссылки:

Комментарии:

1. Спасибо! Это именно то, что я хотел сделать.

2. @Mikhail Спасибо, что ответили и протестировали его. Я рад, что ваша проблема была решена. И тебе спасибо.