ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
download 属性とは
<a> 要素の download 属性は、リンク先をブラウザで開かずにダウンロードして保存させるための属性です。PDF や画像のようにブラウザが普段ビューアで表示してしまうファイルを、確実に「保存」として扱わせたい場合に使います。
基本構文
1. ファイル名を指定しない(サーバ側の名前で保存)
<a href="/files/manual.pdf" download>マニュアルをダウンロード</a>
2. ファイル名を指定する
<a href="/files/20260611-abc123.pdf" download="マニュアル.pdf">
マニュアルをダウンロード
</a>
サーバ上のハッシュ付きファイル名を、ユーザーが見やすい名前で保存させる典型パターンです。
使えるケース・使えないケース
同一オリジンまたは blob: / data: URL のときだけ有効です。クロスオリジンの URL では、ブラウザは安全のため download を無視します(通常のリンクとして開く)。
| リンク先 | download 属性 |
|---|---|
| 同じドメインのファイル | ○ 有効(ファイル名指定も可) |
blob: URL | ○ 有効 |
data: URL | ○ 有効 |
| 別ドメインのファイル | × 無視(リンクとして開かれる) |
同じドメインに Content-Disposition: attachment | サーバ側が優先 |
ファイル名指定の挙動
- download のみ → サーバ側のファイル名(URL 末尾)で保存
- download="name.ext" → その名前で保存
- サーバ側で
Content-Disposition: attachment; filename="..."がある場合、サーバ側が優先される実装が多い - 拡張子は自動補完されない(
download="data"なら拡張子なし) - OS で使えない文字(
/や:など)は自動でアンダースコア等に置換される
典型的なユースケース
PDF を「表示」ではなく「保存」させる
ブラウザは PDF をビューアで開いてしまうことが多いですが、download を付けると保存ダイアログが出ます。
<a href="/docs/report.pdf" download>レポートをダウンロード</a>
画像を保存させる
右クリックして保存しなくても、ボタン感覚でダウンロードできます。
<a href="/img/photo.jpg" download="my-photo.jpg">
写真を保存
</a>
JS で生成したテキストを保存する
Blob を URL.createObjectURL で URL 化し、それを download 付きリンクとしてクリックします。CSV / JSON / ログ出力でよく使う定番パターンです。
function downloadText(filename, text) {
const blob = new Blob([text], { type: "text/plain;charset=utf-8" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
a.remove();
URL.revokeObjectURL(url); // メモリ解放
}
// CSV をダウンロード
downloadText("data.csv", "name,age\nAlice,30\nBob,25");
data: URL で小さなファイルを保存する
<a href="data:text/plain;charset=utf-8,Hello%20World" download="hello.txt">
hello.txt をダウンロード
</a>
サーバ側からも強制ダウンロードする
クロスオリジンや確実性が求められる場面では、サーバ側のレスポンスヘッダでダウンロード扱いにします。HTML だけに頼るより堅実です。
Content-Disposition: attachment; filename="report.pdf"
Content-Type: application/pdf
PHP の例:
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="report.pdf"');
readfile('/var/files/report.pdf');
ブラウザ対応状況
- Chrome / Edge / Firefox / Safari ともに対応(モダンブラウザ)
- iOS Safari は仕様上の制約で挙動が独特 — ファイルが新しいタブで開いてしまうケースがある
- クロスオリジン URL は前述のとおりすべてのブラウザで無視される
セキュリティ上の注意
- ユーザー入力の値を download に直接埋めない — 拡張子偽装などの攻撃に繋がる可能性
- 外部 URL に対しては効かない仕様なので、過信しない
- ダウンロードファイル自体はサーバ側で適切な Content-Type / Disposition を返すのがベストプラクティス
JS から動的にダウンロードを発火する
すでに DOM 上にあるリンクに頼らず、ボタンクリックをトリガに JS でファイルを作って即ダウンロードさせるパターンも頻出です。コードでは「不可視のリンクを作って click() を呼び、すぐ取り除く」のがイディオムです。
async function downloadFromApi(apiUrl, filename) {
const res = await fetch(apiUrl);
const blob = await res.blob();
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = filename;
a.style.display = "none";
document.body.appendChild(a);
a.click();
a.remove();
URL.revokeObjectURL(url);
}
// 例: API レスポンスを PDF として保存
downloadFromApi("/api/report.pdf", "report.pdf");
ボタンとして見せる
意味的にダウンロードリンクは <a> ですが、見た目をボタン風にするのは CSS だけで完結します。
.download-btn {
display: inline-block;
padding: 10px 20px;
background: #2563eb;
color: #fff;
border-radius: 6px;
text-decoration: none;
font-weight: bold;
}
.download-btn:hover { background: #1d4ed8; }
関連
- a 要素 — ハイパーリンク
- href 属性 — リンク先 URL
- target 属性 — リンクを開くウィンドウ
- Blob / URL.createObjectURL — JS でのファイル生成
- Content-Disposition — サーバ側でのダウンロード指定
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
- href属性
- target属性
- download 属性
- rel 属性
- hreflang属性
- type属性
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- HTML input要素 完全ガイド(type 一覧 / text / email / number / date / file / checkbox / radio / 属性 / バリデーション / アクセシビリティ) 2026-06-11 07:09:49
- Rails サーバーの起動 完全ガイド(rails server / rails s / -p ポート指定 / -b バインド / 環境 / Puma / 停止 / トラブル) 2026-06-11 07:09:49
- Oracle インスタンス 完全ガイド(SGA / バックグラウンドプロセス / データベースとの分離 / 起動と停止) 2026-06-11 07:09:49
- Rails モデルの作成 完全ガイド(rails g model / マイグレーション / 型一覧 / リレーション references / バリデーション / db:migrate / 取り消し) 2026-06-11 07:09:49
- Oracle 表関連 DDL 完全ガイド(CREATE / ALTER / DROP / TRUNCATE / RENAME / COMMENT) 2026-06-11 07:09:49
- Java String.trim 完全ガイド(先頭末尾の空白除去 / strip との違い / Unicode 空白対応) 2026-06-11 07:09:49
- Google OAuth 2.0 エラー一覧 完全ガイド(invalid_request / invalid_client / invalid_grant / redirect_uri_mismatch / access_denied / 対処法) 2026-06-11 07:09:49
- ファームウェア (Firmware) 完全ガイド(定義 / BIOS / UEFI / ルータ / IoT / 更新の流れ / 文鎮化対策 / セキュリティ) 2026-06-11 07:09:49
- CSS font-variant 完全ガイド(small-caps / OpenType 機能 / font-variant-* ファミリ / 数字組み) 2026-06-11 07:09:49
- WordPress サイト引越し完全ガイド(ファイルコピー / DB エクスポート / wp-config / siteurl 書き換え / DNS 切替) 2026-06-11 07:09:49
- HTML track要素 完全ガイド(字幕 / キャプション / WebVTT / kind属性 / 多言語対応) 2026-06-11 07:09:49
- HTML dl要素 完全ガイド(定義リスト / dt / dd の使い方とアクセシビリティ・スタイリング) 2026-06-11 07:09:49
- UE5 キャラクターに特定オブジェクトとの当たり判定を付ける完全ガイド(Collision Preset / Object Type / OnComponentBeginOverlap / Tag / Cast To / トラブル) 2026-06-11 07:09:49
- button で form を submit させない方法 完全ガイド(type="button" / preventDefault / Enter キー / フォーム外 / アクセシビリティ) 2026-06-11 07:09:49
- 実行計画の出力 完全ガイド(EXPLAIN / EXPLAIN ANALYZE / MySQL / PostgreSQL / Oracle / type / rows / 読み方とチューニング) 2026-06-11 07:09:49
コメントを削除してもよろしいでしょうか?