LoginSignup
20
21

More than 5 years have passed since last update.

Electronアプリからファイルをダウンロード

Last updated at Posted at 2015-09-13

Electronアプリからファイルをダウンロードする方法です。
自分好みのPushbulletクライアントを作成する途中で必要になりました。

前提

・PushbulletのAPIだとpushしたファイルのURLをの形式で取得できます。このファイルをElectronアプリ上で取得してローカルに保存します。

https://dl.pushbulletusercontent.com/<ID文字列>/<ファイル名>

・Mac環境でのみ確認しています。
・とりあえず次の拡張子で動作確認しています:txt,xml,svg,jpg,png,pdf,key,zip

方法

let request = require('request');

// ①
request(url, {
    encoding: 'binary'
}, (error, response, body) => {
    if (!error) {
        let remote = require('remote');

        // ②
        let lastSavePath = window.localStorage.getItem('lastSavePath') || '';

        // ③
        remote.require('dialog').showSaveDialog({
            defaultPath: lastSavePath + filename,
            title: 'Download File',
            filters: [{
                name: "File",
                extensions: [filename.split('.').pop()]
            }]
        }, (filePath) => {

            // ④
            if (filePath) {
                let fs = require('fs');

                // ⑤
                let savedFileName = filePath.split('/').pop();
                window.localStorage.setItem('lastSavePath', filePath.replace(savedFileName, ''));
                fs.writeFile(filePath, body, 'binary', (err) => {});
            }
        });
    }
});

①. requestでurlにアクセスしてエラーが返ってこなければファイルの保存処理に進みます
②. lastSavePathは前回ファイルを保存したパスです。⑤で設定しています。
③. オプションを設定して保存ダイアログを呼び出します

  • defaultPath: 保存先の初期パス ファイル名まで指定しないと"名称未設定"で初期表示
  • title: ダイアログのタイトル
  • filters: nameとextensionsは必須のパラメータ
  • name: 意味はよくわからない。今回の使い方ではなんでもいいっぽい
  • extensions: ファイルの拡張子

④. 保存ダイアログでOKされたら保存先パスがfilePathに入ります。
  キャンセルされるとundefinedです。
⑤. 保存されたファイル名をsavedFileNameに取得します。
  filePathからファイル名を除いて保存先パスをlocalStorageに入れておきます。
  '/'で分割しているのでWindowsだとうまく動かないかも。

参考URL

Electron の dialog モジュールを使ってみる

20
21
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
20
21