JavaScript で画像をローカルにダウンロード
はじめに
JavaScript で画像をローカルにダウンロードする方法を整理した。
img
タグで表示されている画像を JS 実行で保存するような処理を想定。
参考: zip にまとめてダウンロード編: JavaScript で複数画像を zip に圧縮してローカルにダウンロード
TL;DR
XMLHttpRequest
でのリクエスト時にresponseType = "blob"
でリクエストcreateObjectURL
でオブジェクト URL を生成a
タグのdownload
属性でファイルを保存revokeObjectURL
でオブジェクト URL を開放
目次
環境・条件
Google Chrome バージョン: 79.0.3945.88(Official Build) (64 ビット)
詳細
「いらすとや トップページのロゴ画像をダウンロード」を例にダウンロードボタンを作る。
完成形
先に完成形。
1 | // ダウンロードボタンを追加 |
上記スクリプトを Dev tools のコンソールで実行すると、トップにボタンが配置される。
このボタンをクリックすると、 いらすとやロゴ.png
がダウンロードされるはず。
解説
関数単位で簡単に解説。
ボタン追加: addImageDownloadButton
1 | // ダウンロードボタンを追加 |
insertAdjacentHTML
でボタンを追加- 追加したボタンにイベントリスナを設定
画像リクエスト: downloadImage
1 | // ダウンロード処理(イベントハンドラ) |
- ロゴ画像の
img
へは"#top img"
でアクセス可能 open()
の第3引数をtrue
に設定true
: 非同期リクエスト (※デフォルトでtrue
なので省略可)- 同期リクエスト(
false
)だとresponseType
を変更できない- 使用上の注意 - MDN を参照
responseType
をblob
に指定- リクエスト完了(成功)時の処理を
onload
で設定- 【メモ】XMLHttpRequestのイベントについて - Qiita にイベントがわかりやすくまとまっている
画像保存: downloadImageToLocal
1 | // ローカルへのダウンロード処理(画像リクエスト完了時に動作) |
createObjectURL()
で、レスポンス(this.response
)からオブジェクト URL を生成- 引数として利用できるのは
File
,Blob
,MediaSource
- ここで利用するために
xhr.responseType = "blob"
としてリクエスト
- ここで利用するために
- 引数として利用できるのは
a
タグのdownload
属性でファイルを保存download
には保存ファイル名を指定
href
属性 に、レスポンス(this.response
)から生成したオブジェクト URL を設定- ダウンロード用リンク(
<a href="..." download="いらすとやロゴ.png"></a>
)を追加してクリックすることでファイルダウンロード- クリック後、ダウンロード用リンクは即削除
- 少し間を空けてから
revokeObjectURL
でオブジェクト用 URL を開放
参考: axios を使う場合
axios
を使って blob
でレスポンスを受け取るには、第2引数に { responseType: "blob" }
を指定すれば良い。
参考: Request config - axios
※1: Dev tools に貼り付けて確認はできないので注意。
※2: Console Importer - Chrome ウェブストア をインストールすると、$i("axios")
で Dev tools 上でも axios
が使えるようになる。
XMLHttpRequest
を使った場合。(前述のコードと同じ)
1 | function downloadImage() { |
axios
を使った場合、downloadImage
が少しスッキリする。
1 | async function downloadImage() { |
まとめ
XMLHttpRequest
でのリクエスト時にresponseType = "blob"
でリクエストcreateObjectURL
でオブジェクト URL を生成a
タグのdownload
属性でファイルを保存revokeObjectURL
でオブジェクト URL を開放
参考文献
- JavaScriptでファイルダウンロード処理を実現する - Qiita
- XMLHttpRequest - Web API | MDN
- AjaxでバイナリのJPEG画像データを受け取って表示する - Qiita
- JavaScriptで画像をダウンロードしたい - Qiita
- 【メモ】XMLHttpRequestのイベントについて - Qiita
- URL.createObjectURL() - Web API | MDN
- URL.revokeObjectURL() - Web API | MDN
- : アンカー要素 - HTML: HyperText Markup Language | MDN
- element.insertAdjacentHTML - Web API | MDN
- axiosでファイルダウンロード処理を実装(IEにも対応) - Qiita
関連記事
- jQuery Select2 で、初期値の設定と選択状態のクリア
- JavaScript で複数画像を zip に圧縮してローカルにダウンロード
- HTML img タグで画像が 404 エラーのときに代替画像を表示する方法
- mailto リンクで 宛先/CC/BCC/件名/本文 を指定 (JavaScript サンプルあり)
- Chart.js(vue-chartjs) でツールチップの表示内容を変更
- Vue.js で日本語変換での誤発火を抑止しつつ Enter キーで Submit
- JavaScript で URL のクエリパラメータを操作する方法
- axios で添付ファイルありのリクエスト(multipart/form-data の POST)