ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
概要
フロント側 JavaScript から Java (Spring Framework) で CSV ファイルを受け取る実装例です。Ajax + FormData を使うことで、画面遷移なしでアップロード進捗・完了を扱えます。
HTML
<form id="fileuploadform" enctype="multipart/form-data">
<input type="file" name="file" id="file" accept=".csv">
<button type="button" id="upload">アップロード</button>
</form>
<div id="result"></div>
JavaScript (jQuery)
$("#upload").click(function() {
var formData = new FormData($('#fileuploadform').get(0));
$.ajax({
method: 'POST',
url: '/csvUpload',
data: formData,
processData: false, // ★ FormData を文字列化させない
contentType: false, // ★ multipart/form-data の boundary を維持
headers: { 'X-CSRF-TOKEN': csrfToken } // CSRF 対策(Spring Security)
}).done(function(res) {
$('#result').text('成功: ' + res.message);
}).fail(function(xhr) {
$('#result').text('失敗: ' + (xhr.responseJSON?.error ?? xhr.status));
});
});
JavaScript(fetch 版・モダン)
document.getElementById('upload').addEventListener('click', async () => {
const file = document.getElementById('file').files[0];
if (!file) { alert('ファイル未選択'); return; }
const formData = new FormData();
formData.append('file', file);
try {
const res = await fetch('/csvUpload', {
method: 'POST',
body: formData,
headers: { 'X-CSRF-TOKEN': csrfToken }
// ★ Content-Type は付けない(fetch が自動で multipart/form-data + boundary)
});
if (!res.ok) throw new Error('HTTP ' + res.status);
const data = await res.json();
document.getElementById('result').textContent = '成功: ' + data.message;
} catch (e) {
document.getElementById('result').textContent = '失敗: ' + e.message;
}
});
Spring Controller
@RestController
public class CsvUploadController {
@PostMapping("/csvUpload")
public ResponseEntity<Map<String, Object>> upload(
@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return ResponseEntity.badRequest()
.body(Map.of("error", "ファイルが空です"));
}
// 拡張子チェック
String name = file.getOriginalFilename();
if (name == null || !name.toLowerCase().endsWith(".csv")) {
return ResponseEntity.badRequest()
.body(Map.of("error", "CSV ファイルのみ対応"));
}
int rows = 0;
try (BufferedReader br = new BufferedReader(
new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8))) {
// BOM スキップ
br.mark(1);
int c = br.read();
if (c != 0xFEFF) br.reset();
String line;
br.readLine(); // ヘッダ行スキップ
while ((line = br.readLine()) != null) {
String[] cols = line.split(",");
// DB 登録など処理
rows++;
}
} catch (IOException e) {
return ResponseEntity.status(500)
.body(Map.of("error", "読み込み失敗: " + e.getMessage()));
}
return ResponseEntity.ok(Map.of("message", rows + " 件を登録"));
}
}
Spring 側のサイズ上限設定
デフォルトでは Spring Boot のアップロード上限は 1MB / 1MB(ファイル / リクエスト全体)です。大きなファイルを扱う場合は application.properties で拡張:
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
# 一時ディレクトリ(メモリ閾値超え時の書き出し先)
spring.servlet.multipart.location=/tmp
# メモリに保持する閾値(これを超えるとディスクへ)
spring.servlet.multipart.file-size-threshold=2KB
processData / contentType を false にする理由
| オプション | デフォルト | FormData 送信時に必要な値 |
|---|---|---|
processData | true(クエリ文字列化) | false(FormData をそのまま送る) |
contentType | application/x-www-form-urlencoded | false(ブラウザに任せて boundary 付き multipart に) |
fetch API ではこの指定は不要 — body に FormData を入れれば自動的に正しいヘッダになります(むしろ手動で Content-Type を付けると boundary が消えて壊れます)。
よくあるエラー
- 413 Payload Too Large: ファイルサイズが上限超え →
spring.servlet.multipart.max-file-sizeを増やす。または Nginx のclient_max_body_size - 403 Forbidden: CSRF トークン未送信(Spring Security)→
X-CSRF-TOKENヘッダ追加 - 415 Unsupported Media Type:
contentType: falseを忘れている → jQuery が間違った Content-Type を送っている - 500 + FileNotFoundException tmp/...: Multipart の一時ディレクトリが書き込み不可 →
spring.servlet.multipart.locationを見直し - 日本語ファイル名が文字化け:
file.getOriginalFilename()がブラウザ依存。URL エンコードする運用が安全
セキュリティ注意
- 拡張子だけでなくマジックバイトもチェック(Polyglot ファイル対策)
- アップロードしたファイルは Web ルート外に保存(直接 URL でアクセスされないように)
- ファイル名は サーバ側で UUID 等にリネーム(パストラバーサル防止)
- 1 リクエストあたりの行数上限を設ける(メモリ枯渇 / DoS 対策)
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- インストール(eclipseプラグイン)
- クイックスタート
- プロジェクトの作成
- Spring Bootプロジェクトの作成
- Spring Bootプロジェクトの実行
- Spring BootでHello World!
- アノテーション一覧
- DB接続設定からエンティティおよびリポジトリの作成、値の取得まで(JPA編)
- DB接続設定や値の取得(JdbcTemplate編)
- ビューから値をモデルに格納しコントローラーで受け取る方法
- コントローラーにてモデルに値を格納してビューに渡す方法
- テンプレートエンジン
- ModelとModelAndViewの違い
- AOPの使用方法
- classpath: 内部ファイルの読み込み
- file: 外部ファイルの読み込み
- CSVファイルアップロード方法(Ajax)
- CSVファイルダウンロード方法(Ajax)
- Spring Bootプロジェクトのビルドと本番環境へのデプロイ方法(内部tomcat使用)
- Application.propertiesの環境依存設定の分割方法
- JPAにおけるEntityManagerの取得方法
- JPAにおけるjava.sql.Connectionの取得方法
- エラー一覧
- jarの引数を受け取る方法
- Spring BootでGmailからメール送信
- 複数のDBに接続する設定(Spring Boot & JPA編)
- ポート番号の変更
- Basic認証の実装と特定のURLに限定する方法
- Spring SecurityのBasic認証の無効化
- 独自のエラーページを定義する方法
- プロパティファイルの値やjar実行時の引数を取得する方法
人気ページ
- 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
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 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
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?