freks blog

about

ファイルをダウンロードする

created: 2023-05-17
おすすめ記事: 出会ってよかったプログラマー本

A tag download

ファイルをダウンロードするには a tag に download 属性を付けると楽です : The Anchor element - HTML: HyperText Markup Language | MDN

<a href="./sample.txt" download>download link</a>

ただし、注意書きにあるように

download only works for same-origin URLs,

と同じオリジンしか動かないとなっていますが、Chrome 114.0.5735.26 だとダウンロードできます

download by JavaScript

JavaScript でダウンロードしてみます

<script>
  function download(path, filename) {
    // fetch parameterは要件にあわせる
    fetch(path, {
      method: 'GET',
      headers: { 'Content-Type': 'application/octet-stream' },
      mode: 'no-cors',
    })
      .then((response) => {
        if (!response.ok) {
          throw new Error(`HTTP error! Status: ${response.status}`)
        }
        return response.blob()
      })
      .then((response) => {
        const fileUrl = URL.createObjectURL(response)

        const link = document.createElement('a')
        link.href = fileUrl
        link.download = filename
        link.style.display = 'none'

        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
      })
  }
</script>

<button onClick="download();">download</button>

fetch に設定するパラメータは要件にあったものにします
fetch() - Web API | MDN
fetch mode について
Request: mode property - Web APIs | MDN

指定する Content-Type: 'application/octet-stream' はダウンロードするファイルの種類が分からない時に設定するといいようです
MIME タイプ (IANA メディアタイプ) - HTTP | MDN

fetch で画像をとってきて、問題なければファイルをダウンロードできるように a tag を組み立ててクリックして作った a tag を削除してます

fetch mode: no-cors で CORS が必要なリンク先を指定してしまうとレスポンスが空になって 0byte のファイルがダウンロードされるので注意です

// Responseの例
{
  "body": null,
  "bodyUsed": false,
  "headers": {},
  "ok": false,
  "redirected": false,
  "status": 0,
  "statusText": "",
  "type": "opaque",
  "url": ""
}

mode: cors にしてアクセスできるようにするなどする必要があります

ファイルがブラウザで開かれるとき

アクセス先からのレスポンスヘッダーに Content-Disposition: attachment を設定するとダウンロードされるはずです
Content-Disposition - HTTP | MDN

References:
Download Any Files in HTML and JavaScript: Ultimate Tutorial | WM


Amazonのアソシエイトとして、blog.freks.jp は適格販売により収入を得ています。
This site is managed by freks