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だとうまく動かないかも。