8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Node.jsでGoogle Drive上のファイルをダウンロードする (Google Drive API v3)

Last updated at Posted at 2020-08-25

1年くらい前にGoogle Drive関連の記事を書いてたけど、久々に触りたくなったので調査再開。

メソッドはFiles: getになります。

ライブラリの書き方だとdrive.files.get()です。

スコープ指定

スコープの指定は割と多め。

https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/drive.file
https://www.googleapis.com/auth/drive.readonly
https://www.googleapis.com/auth/drive.metadata.readonly
https://www.googleapis.com/auth/drive.appdata
https://www.googleapis.com/auth/drive.metadata
https://www.googleapis.com/auth/drive.photos.readonly

ダウンロードする

チュートリアルfunction listFilesの箇所を書き換えて利用してみます。

機能的にはfunction dlFileとかにリネームした方が良いでしょうが一旦動かす体なのでスルー

fileIdにGoogle DriveのファイルのIDを指定しましょう。

またtest.mp4としてますが、ファイルの種類によって拡張子は変えてください。

dj.js
async function listFiles(auth) {
    const drive = google.drive({version: 'v3', auth});
    const fileId = `xxxxxxxxxxxx`; //GoogleDriveのファイルIDを指定
    const dest = fs.createWriteStream('test.mp4', 'utf8');
    try {
        const res = await drive.files.get({fileId: fileId, alt: 'media'}, {responseType: 'stream'});
        res.data.on('data', chunk => dest.write(chunk));
        res.data.on('end', () => dest.end()); //保存完了
    } catch (err) {
        console.log('The API returned an error: ' + err);
    }
}

けっこうシンプルに書けますね。
実行すると手元にtest.mp4が保存されます。

おまけ: プログレス表示

公式サンプルを参考にして書くとこんな感じになります。

dl.js
//省略

async function listFiles(auth) {
    const drive = google.drive({version: 'v3', auth});
    const fileId = `xxxxxxxxxxxx`; //GoogleDriveのファイルIDを指定

    const dest = fs.createWriteStream('test.mp4', 'utf8');
    let progress = 0;

    try {
        const res = await drive.files.get({fileId: fileId, alt: 'media'}, {responseType: 'stream'});
        
        res.data.on('end', () => console.log('Done downloading file.'))
            .on('error', err => console.error('Error downloading file.'))
            .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);    
    } catch (err) {
        console.log('The API returned an error: ' + err);
    }
}
  • 実行

こんな感じでプログレス表示があって良いですね。

$ node dj.js
Downloaded 79767428 bytesDone downloading file.

所感

実際に使うときには、

    1. drive.files.list()でフォルダ内のファイル一覧及びIDなど取得
    1. drive.files.get()でダウンロード

みたいな流れが多いかなぁと思います。

ファイル保存でStreamを使うあたりがNode.jsっぽさを感じますね。

参考: Node.js Stream を使いこなす

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?