Как скачать файлы с помощью Google Drive API REST? - PullRequest
0 голосов
/ 08 октября 2019

У меня проблемы с загрузкой файлов с Google Диска с использованием API REST v3. Я делаю запрос через axios и получаю буфер массива в качестве ответа, однако буфер при сохранении в файл поврежден.

Это заголовки ответа, которые я получаю при выполнении запроса:

HTTP/1.1 200 date: Mon, 07 Oct 2019 21:36:21 GMT
content-encoding: gzip
expires: Mon, 07 Oct 2019 21:36:21 GMT
server: GSE
content-type: text/plain; charset=UTF-8
vary: Origin, X-Origin
cache-control: private, max-age=0, must-revalidate, no-transform
Content-Type: application/pdf
{file content}

Я предполагаю, что сжатие gzip и кодировка utf-8 - вот что портит файл. Я также скачал тот же файл через браузер и сравнил их необработанное содержимое, и, несомненно, содержимое отличается в обоих файлах. Любая помощь будет оценена.

РЕДАКТИРОВАТЬ:

Вот как я делаю запрос в настоящее время, для которого я получаю в качестве ответа вышеупомянутые заголовки и содержимое файла.

const {data} = await axios.get(`${exportLink}&${qs.stringify({access_token: access_token})}`, {responseType: 'arraybuffer',
        timeout: 30000,})

1 Ответ

0 голосов
/ 08 октября 2019

Как сказал @ Suhakar RS , вы можете посмотреть этот пример , чтобы узнать, как это сделать.

Это соответствующая часть:

drive.files
  .get({fileId, alt: 'media'}, {responseType: 'stream'})
  .then(res => {
    return new Promise((resolve, reject) => {
      const filePath = path.join(os.tmpdir(), uuid.v4());
      console.log(`writing to ${filePath}`);
      const dest = fs.createWriteStream(filePath);
      let progress = 0;

      res.data
        .on('end', () => {
          console.log('Done downloading file.');
          resolve(filePath);
        })
        .on('error', err => {
          console.error('Error downloading file.');
          reject(err);
        })
        .on('data', d => {
          progress += d.length;
          if (process.stdout.isTTY) {
            process.stdout.clearLine();
            process.stdout.cursorTo(0);
            process.stdout.write(`Downloaded ${progress} bytes`);
          }
        })
        .pipe(dest);
    });
  });

Обратите внимание, что файл запрашивается как поток и записывается в том же формате.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...