Node.jsでGoogle Driveにファイルをアップロードする (Google Drive API v3)


Google Driveへのファイルアップロードも試してみます。

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

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

.uploadではないので注意。

スコープ指定

https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/drive.file
https://www.googleapis.com/auth/drive.appdata

フォルダを指定してアップロード

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

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

folderIdにGoogle Driveのアップロード先のフォルダのIDを指定しましょう。

パラメータでresource.parentsを指定していますが、ここが配列なので複数のフォルダに配置もできそうですね。

参考: Create a file in a folder

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

create.js
//省略

async function listFiles(auth) {
    const drive = google.drive({version: 'v3', auth});

    const fileName = `test.mp4`;
    const folderId = 'xxxxx';

    const params = {
        resource: {
            name: fileName,
            parents: [folderId]
        },
        media: {
            mimeType: 'video/mp4',
            body: fs.createReadStream(fileName)
        },
        fields: 'id'
    };

    const res = await drive.files.create(params);
    console.log(res.data);
};

実行すると手元のtest.mp4が指定したGoogle Driveのフォルダにアップロードされます。

おまけ: プログレス表示

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

dl.js
//省略

    const fileSize = fs.statSync(fileName).size;
    const res = await drive.files.create(params, {
        onUploadProgress: evt => {
          const progress = (evt.bytesRead / fileSize) * 100;
          readline.clearLine();
          readline.cursorTo(0);
          process.stdout.write(`${Math.round(progress)}% complete`);
        },
    });
    console.log(res.data);
  • 実行

こんな感じのプログレス表示になります。

$ node create.js
・
・
・
mplete99% complete99% complete99% complete99% complete99% complete99% complete100% complete100% complete100% complete100% complete100% complete100% complete100% complete100% complete100% complete100% complete100% complete100% complete100% complete100% complete100% complete100% complete100% complete100% complete{ id: 'xxxxxxxxxxxxxx' }

よもやま

res.dataのあたりでなんとく分かる人はいるかもしれないですが、こちらにコメントがあるようにaxiosを使ってアップロードしてるみたいですね。

そして公式ドキュメントがけっこうアップデートされていて公式のコード使えば良さそうってのに後から気づいた