Node.jsのfetchで画像をダウンロードしてローカルディレクトリへ保存するエンドポイントの作成
経緯
SNS認証がでログインを実施するアプリを構築していてその際にログインしたユーザーのアカウント画像を保存する必要があり
その際の設計でエンドポイントを叩いて画像をダウンロードできるようにしたかったため
画像をダウンロードできるエンドポイントを作成しました。
環境
- node 14.15.3
- express 4.17.1
ファイル操作で利用するUnixコマンドについて
基本的なディレクトリ作成やファイル操作はUnixコマンドを利用します。
Unixコマンドについて詳しくはこちらの記事を参考にしてください。
構築手順
fetchはisomorphic-fetchを利用し、エンドポイントはexpressで作成しています。
必要パッケージのダウンロード
isomorphic-fetchとexpressのインストール
isomorphic-fetchとexpressをyarnコマンドでインストールします。
npmで実施する方は必要に応じて適宜変更してください。
terminal$ yarn add isomorphic-fetch express
ダウンロードの実装
main.jsへ実装処理を記述していきます。
また記述言語についてはTypeScriptを利用します。
それぞれ必要に応じて適宜変更してください。
必要パッケージのインポート
インストールしたパッケージをインポートしていきます。
main.tsimport express from 'express';
import fetch from 'isomorphic-fetch';
合わせてファイル保存を利用するfsモジュールもインポートします。
javascriptimport fs from 'fs'
expressの初期化
main.tsconst app = express();
エンドポイントの作成
/api/downloadを叩いでダウンロードできるようにします。
main.tsapp.get('/api/download',
async (
req: express.Request,
res: express.Response
): Promise<void> => {
}
)
引数の取得
リクエストするURLと保存するパスとをクエリパラメータから取得できるようにします。
request_url
取得する画像のURL
filename
保存する画像のファイル名
main.tsconst { request_url, filename } = req.query;
画像を保存するディレクトリ
画像を保存するディレクトリを定義します。
main.tsconst downloadDir = 'download'
画像を保存
fetchで画像を取得し画像を保存します。
main.tstry {
const response = await fetch(request_url);
const savePath = `${downloadDir}/${filename}`;
response.body.pipe(fs.createWriteStream(savePath));
res.send("画像を保存しました。")
} catch (error) {
console.error(error);
res.send("エラーが発生しました。")
}
コード全体
画像を保存する処理の全体コードになります。
javascriptimport express from 'express';
import fetch from 'isomorphic-fetch';
import fs from 'fs'
app.get('/api/download',
async (
req: express.Request,
res: express.Response
): Promise<void> => {
const { request_url, filename } = req.query;
const downloadDir = 'download'
try {
const response = await fetch(request_url);
const savePath = `${downloadDir}/${filename}`;
response.body.pipe(fs.createWriteStream(savePath));
res.send("画像を保存しました。")
} catch (error) {
console.error(error);
res.send("エラーが発生しました。")
}
}
)
app.listen(8000, () => {
console.log(`listening on *:${8000}`);
});
リクエストして確認
アプリケーション起動
作成したmain.tsからアプリケーションを立ち上げます。
TypeScriptで記述しているためts-nodeで起動しています。
terminal$ ts-node main.ts
URLへアクセス
起動したアプリケーションへアクセスします。
http://localhost:8000/api/download?request_url=https://placehold.jp/150x150.png&filename=sample.png
データを確認
download配下に取得したファイルが作成されていれば成功です。
└── download
└── sample.png
articleReact クリーンアーキテクチャ実践:UI・アプリ・ドメイン・データの責務分離
articleWebLLM vs サーバー推論 徹底比較:レイテンシ・コスト・スケールの実測レポート
articleVitest モック技術比較:MSW / `vi.mock` / 手動スタブ — API テストの最適解はどれ?
articlePython ORMs 実力検証:SQLAlchemy vs Tortoise vs Beanie の選び方
articleVite で Web Worker / SharedWorker を TypeScript でバンドルする初期設定
articlePrisma Accelerate と PgBouncer を比較:サーバレス時代の接続戦略ベンチ
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来