Как получить заархивированный файл с Google Диска с помощью команд NodeJS googleapis? - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь использовать Google Drive API, чтобы хранить некоторые из тех слегка секретных файлов, которые не принадлежат общедоступному git-репо.(например, файлы конфигурации виртуального хоста Nginx, сжатое дерево каталогов файлов инициализации базы данных и т. д.), чтобы я мог при необходимости включить их в сценарий установки сервера.

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

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

Моё приложение NodeJ, которое успешно загружает тестовые файлы, выглядит следующим образом:

const fs = require('fs');
const { google } = require('googleapis');

const { authorize, loadToken } = require('./auth');

const fileId = process.argv[2];
const fileName = process.argv[3];
const targetPath = process.env.XDG_RUNTIME_DIR;


/**
 * Gets a single file from GDrive and writes it to ${XDG_RUNTIME_DIR}
 * File specified by the command line parameters
 *  - 1st. fileId
 *  - 2nd. fileName
 * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
 */
function getFile(auth) {
  const drive = google.drive({ version: 'v3', auth });
  const options = {encoding:'utf-8', flag:'w'};

  drive.files.get({
    fileId: fileId,
    // mimeType: 'application/gzip',
    alt: 'media'
  }, (err, res) => {
    if (err) return console.log('The API returned an error: ' + err);
    process.stdout.write(fileName);
    const filePath = `${targetPath}/${fileName}`;
    fs.writeFileSync(filePath, res.data, options);
  });
}

// Load client secrets from a local file.
fs.readFile('credentials.json', (err, content) => {
  if (err) return console.log('Error loading client secret file:', err);
  // Authorize a client with credentials, then call the Google Drive API.
  authorize(JSON.parse(content), getFile);
});

Чтобы показать то, что я вижу, я создал крошечную tar.gz.Вот как это выглядит перед загрузкой в ​​GDrive:

me@desktop:~/temp$ ls -la Example.tar.gz
-rw-r--r-- 1 me us 551 Mar  8 06:53 Example.tar.gz
me@desktop:~/temp$ tar -tf Example.tar.gz 
bottles/
bottles/design/
bottles/design/bottles.json
bottles/bottles_short.json
me@desktop:~/temp$ cat Example.tar.gz; echo "";
�W�\��Qo�0�y���`�Ю�lb��)͞��
9@W��t�"��� P Z�II���������yf�*οZ'����(|O��K����{.��w-����j��QƬ��U�L�K�e����>=M���c9�!,}����������?=���^
                                                                                                                       <������I�����=�3|����ف��o0t��vP{���TL��:PX��R��7٨�ފcZ�=�I�����D1e�2:�޿F��3V���u̦�);�&;��8ѦI�v ~k���oI�,��YG�B(�
���;+Xa��S
          �W
            ޻ڇ��ߏA��6�����BH����������[��ɡy��?�e�����������-���v�\l~���tt3�����>�.E�fv}�WѨ��w����(f�\�K~u�E'k;ס
ap����i�k�u.-�[>�
NAAAAAA��?{��(�?.���_�v��"���g���"�p7���
me@desktop:~/temp$

Вот как это выглядит после использования googleapis для загрузки из GDrive: Обратите внимание, что он вдвое больше размера на диске, но материал из cat выглядит очень, очень похоже.

me@server:/run/user/1001$ ls -la Example.tar.gz 
-rw-rw-r-- 1 me us 1011 Mar  8 04:39 Example.tar.gz
me@server:/run/user/1001$ tar -tf Example.tar.gz 

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now
me@server:/run/user/1001$ cat Example.tar.gz; echo "";
�W�\�Qo�0�y���`�Ю�lb��)͞��
9@W��t�"��� P Z�II���������yf�*οZ'����(|O��K����{.��w-��j��QƬ��U�L�K�e����>=M���c9�!,}���������?=���^
                                                                                                                    <�����I����=�3|����ف��o0t��vP{��TL��0K�*4A���AI�'Yl���,e_�,�`;���(RF��3V���u̦�);�&;��8ѦI�v ~:PX��R��7٨�ފcZ�=�I�����D1e�2:�޿
���;+Xa��S
          �W
            ޻ڇ��ߏA��6����BH����������[��ɡy��?�e����������-���v�\l~���tt3�����>�.E�fv}�WѨ��w����(f�\�K~u�E'k;ס
ap����i�k�u.-�[>�
NAAAAAA��?{��(�?.��_�v��"���g���"�p7���
me@server:/run/user/1001$ 

Как видно из закомментированной строки, я попытался установить mimeType.Это не имело значения.

У меня три вопроса:

  1. Wtf?
  2. Что я могу сделать, чтобы загрузить файл GZ из GDrive?
  3. Есть ли какая-то предварительная обработка или пост-обработка или и то, и другое, что я должен делать?

1 Ответ

0 голосов
/ 08 марта 2019

Geez. Я думаю, что это хороший пример того, «если вы не можете решить проблему, просто скажите об этом деревянному индейцу» **.

Предварительная и последующая обработка - это, конечно, ответ. Duh!

Перед отправкой в ​​GDrive:

base64 Example.tar.gz > Example.tar.gz.b64

После возврата из GDrive:

base64 -d Example.tar.gz.b64 > Example.tar.gz

** В прошлом тысячелетии, точно так же, как у парикмахерских был красно-белый спиральный «полюс парикмахера» снаружи, у табачных табаков был деревянный индиец. Часто курильщики с ворчащими проблемами видели, как они ходят перед индейцами, бормотая и жестикулируя. Как ни странно, это был не плохой способ заставить подсознание работать над ним.

Деревянный индеец (jpg)

...