ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
概要
本稿は Ajax を用いた CSV ファイルのダウンロード方法を記載します。サーバーサイドは Java の Spring Framework を例にします(適宜読み替えてください)。
普通の <a href> や window.location.href = "/csv" でもダウンロードできますが、認証ヘッダや POST パラメータを送りたい・エラー時に画面遷移したくない場合に Ajax + Blob 方式が便利です。
HTML
<button type="button" id="download">ダウンロード</button>
JavaScript(jQuery)
$("#download").click(function() {
$.ajax({
method: 'POST',
url: '/csvDownload',
xhrFields: { responseType: 'blob' } // ★ バイナリで受け取る
}).done(function(data) {
// BOM を付与(Excel で文字化けしない)
const bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
const blob = new Blob([bom, data], { type: 'text/csv' });
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'data.csv';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}).fail(function(xhr) {
alert('ダウンロード失敗: ' + xhr.status);
});
});
JavaScript(fetch 版・モダン)
document.getElementById('download').addEventListener('click', async () => {
try {
const res = await fetch('/csvDownload', {
method: 'POST',
headers: { 'X-CSRF-TOKEN': csrfToken }
});
if (!res.ok) throw new Error('HTTP ' + res.status);
const blob = await res.blob();
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'data.csv';
a.click();
URL.revokeObjectURL(url);
} catch (e) {
alert('ダウンロード失敗: ' + e.message);
}
});
サーバ(Spring Controller)
@PostMapping(value = "/csvDownload", produces = "text/csv")
public ResponseEntity<byte[]> downloadCsv() {
StringBuilder sb = new StringBuilder();
sb.append("id,name,email\r\n"); // ヘッダ行
sb.append("1,山田太郎,yamada@example.com\r\n");
sb.append("2,鈴木花子,suzuki@example.com\r\n");
// UTF-8 BOM を先頭に付与(Excel 文字化け対策)
byte[] bom = { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
byte[] body = sb.toString().getBytes(StandardCharsets.UTF_8);
byte[] result = new byte[bom.length + body.length];
System.arraycopy(bom, 0, result, 0, bom.length);
System.arraycopy(body, 0, result, bom.length, body.length);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("text/csv; charset=UTF-8"));
headers.setContentDispositionFormData("attachment", "data.csv");
return new ResponseEntity<>(result, headers, HttpStatus.OK);
}
レスポンスヘッダの意味
| ヘッダ | 役割 |
|---|---|
Content-Type: text/csv | CSV ファイルだとブラウザに伝える |
Content-Type: ...; charset=UTF-8 | 文字コード明示。BOM と組み合わせて Excel 文字化けを防ぐ |
Content-Disposition: attachment; filename=... | ダウンロードダイアログを出す。inline だとブラウザ内表示 |
Content-Length | サイズ通知(Spring が自動付与) |
BOM の有無による Excel での挙動
- BOM あり(推奨): UTF-8 と認識して日本語が正しく表示される
- BOM なし: Excel が Shift_JIS と誤認して文字化け(特に Windows 版)
- Excel 以外(VS Code、Linux の
cat)では BOM 無しでも UTF-8 として正しく読める
よくあるハマりどころ
- カンマを含むデータ:
"hello, world"のようにダブルクォートで囲む - ダブルクォートを含むデータ:
"を""にエスケープして全体をダブルクォートで囲む - 改行コード: CSV の慣例は
\r\n。\nでも大体読めるが Excel 安全策で CRLF - 大量データ:
StringBuilderではなくStreamingResponseBodyでストリーミングする - ファイル名の日本語:
filename*=UTF-8''+ URL エンコード形式を使う(RFC 5987)
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- $.ajax()
- CSVファイルのダウンロード
人気ページ
- 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アノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?