Загрузка файла с Google Диска в клиенте Javascript

Я пытаюсь интегрировать Google Диск в свое угловое приложение, чтобы наши пользователи могли копировать содержимое из документов и загружать свои изображения в мое приложение. Согласно file:get API Documentation, я используя приведенный ниже код, чтобы получить файл

var request = gapi.client.drive.files.get({
        'fileId': fileId
    });
     var temp = this;
     request.execute(function (resp) {
});

Но в ответ я получаю только имя файла и идентификатор. URL-адрес загрузки, который требуется для функции downloadFile, отсутствует. Ответ:

{kind: "drive#file", 
  id: "1KxxxxxxxxxxxxxxycMcfp8YWH2I",
   name: " Report-November", 
   mimeType: "application/vnd.google-apps.spreadsheet", 
    result:{
kind: "drive#file"
id: "1K7DxawpFz_xiEpxxxxxxxblfp8YWH2I"
name: "  Report-November"
mimeType: "application/vnd.google-apps.spreadsheet"
  }
}



Функция загрузки файла:

/**
 * Download a file's content.
 *
 * @param {File} file Drive File instance.
 * @param {Function} callback Function to call when the request is complete.
 */
 downloadFile(file, callback) {
    if (file.downloadUrl) {
        var accessToken = gapi.auth.getToken().access_token;
        var xhr = new XMLHttpRequest();
        xhr.open('GET', file.downloadUrl);
        xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
        xhr.onload = function () {
            callback(xhr.responseText);
        };
        xhr.onerror = function () {
            callback(null);
        };
        xhr.send();
    } else {
        callback(null);
    }
}

Я что-то упустил? Правильно ли загружать файл с Диска на стороне клиента?


person VBC    schedule 24.03.2020    source источник
comment
Я должен извиниться за мое плохое знание английского языка. К сожалению, я не могу понять о вашей цели. Итак, могу я спросить вас о вашем вопросе? Вы хотите получить URL-адрес загрузки идентификатора файла? Или вы хотите скачать файл ID файла? Чего вы хотите достичь?   -  person Tanaike    schedule 25.03.2020
comment
@Tanaike Я хочу скачать файл.   -  person VBC    schedule 25.03.2020
comment
Спасибо за ответ. Из вашего ответа я предложил модифицированный сценарий. Не могли бы вы подтвердить это? Если я неправильно понял ваш вопрос, и это было не то направление, которое вам нужно, приношу свои извинения.   -  person Tanaike    schedule 25.03.2020


Ответы (2)


Вопрос 1:

  • Вы хотите загрузить файл из Drive API.
  • Ваш токен доступа можно использовать для загрузки файла.
  • У вас есть разрешение на загрузку файла.
  • Вы используете метод files.get в Drive API. В данном случае это не Google Docs.
  • Вы хотите добиться этого, используя gapi с Javascript.

Если я правильно понимаю, как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

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

  • Чтобы загрузить файл с помощью метода files.get в Drive API, используйте alt=media в качестве параметра запроса. Когда это отразится на gapi, добавьте alt: "media" к объекту запроса.

Модифицированный скрипт:

Когда ваш скрипт изменен, он становится следующим.

From:
var request = gapi.client.drive.files.get({
        'fileId': fileId
    });
     var temp = this;
     request.execute(function (resp) {
});
To:
gapi.client.drive.files.get({
  fileId: fileId,
  alt: "media"
}).then(function(res) {

  // In this case, res.body is the binary data of the downloaded file.

});

Ссылка:

Вопрос 2:

  • Вы хотите загрузить документ Google в формате DOCX.

В этом случае используйте метод files.export следующим образом.

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

gapi.client.drive.files.export({
  fileId: fileId,
  mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
}).then(function(res) {

  // In this case, res.body is the binary data of the downloaded file.

});
  • В данном случае fileId — это идентификатор файла Google Document. Пожалуйста, будьте осторожны с этим.

Ссылка:

person Tanaike    schedule 25.03.2020
comment
Спасибо за ответ. Я могу получить файлы изображений, используя alt:media. Как я могу получить содержимое документа Google Docs? Я получаю ошибку-› причина: сообщение fileNotDownloadable: можно загружать только файлы с двоичным содержимым. Используйте экспорт с файлами Google Docs..docx - person VBC; 25.03.2020
comment
@VBC Спасибо за ответ. Я рад, что ваш вопрос разрешился. Что касается вашего второго вопроса, я добавил пример сценария в свой ответ. Не могли бы вы подтвердить это? Если это было не то направление, которое вы хотели, я извиняюсь. - person Tanaike; 25.03.2020
comment
Работает нормально. Спасибо за ваше время - person VBC; 25.03.2020
comment
@VBC Спасибо за ответ и тестирование. Я рад, что ваша проблема была решена. - person Tanaike; 25.03.2020

Это хорошо для загрузки изображения

async function downloadFile(fileId: string, mimeType: string) {
        const res = await gapi.client.drive.files.get({
            fileId,
            alt: 'media'
        });
        const base64 = 'data:' + mimeType + ';base64,' + Buffer.from(res.body, 'binary').toString('base64');
        return base64;
    }
person ShaMan    schedule 18.01.2021