Struts2でファイルをアップロードするための基本構成と設定方法、注意点を実例付きで解説します。
✅ 1. Struts2でファイルアップロードするには?
Struts2には、ファイルアップロード専用のサポートがあり、MultipartRequestWrapper
によりアップロードファイルが自動的に処理されます。
✅ 2. 必要な準備と設定
📦 依存ライブラリの確認
ファイルアップロードには以下のJARが必要です:
commons-fileupload-x.x.jar
commons-io-x.x.jar
Mavenの場合:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
🛠 struts.xml の設定
<action name="uploadFile" class="com.example.UploadAction">
<result name="success">/uploadSuccess.jsp</result>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="defaultStack"/>
</action>
-
fileUpload
インターセプターが必須!
✅ 3. アップロード用フォーム(JSP)
<s:form action="uploadFile" method="post" enctype="multipart/form-data">
<s:file name="upload" label="ファイル選択" />
<s:submit value="アップロード" />
</s:form>
- enctype="multipart/form-data" を 必ず 指定すること!
✅ 4. アクション側の実装例(UploadAction.java)
public class UploadAction extends ActionSupport {
private File upload; // アップロードされたファイル本体
private String uploadFileName; // ファイル名
private String uploadContentType; // コンテントタイプ
public String execute() throws Exception {
// 保存先ディレクトリ
String destPath = "/your/server/upload/directory/";
// 保存ファイル
File destFile = new File(destPath, uploadFileName);
// Apache Commons IOでコピー
FileUtils.copyFile(upload, destFile);
return SUCCESS;
}
// Getter/Setter(Struts2が自動的にセットする)
public void setUpload(File upload) { this.upload = upload; }
public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; }
public void setUploadContentType(String uploadContentType) { this.uploadContentType = uploadContentType; }
}
✅ 5. セキュリティと運用面の注意点
注意点 | 内容 |
---|---|
📁 保存場所 | アップロードファイルはWebルート外に保存するのが安全(例:/WEB-INF の外) |
✅ 拡張子制限 |
fileUpload インターセプターで許可された拡張子を設定可能 |
🛑 ファイルサイズ制限 |
struts.xml で最大ファイルサイズを設定 |
🔐 アップロード後のスキャン | ウイルスチェックやコンテンツ検査が望ましい |
🔒 拡張子/サイズ制限の例
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/jpeg,image/png,application/pdf</param>
<param name="maximumSize">2097152</param> <!-- 2MB -->
</interceptor-ref>
✅ 6. よくあるトラブルと解決策
問題 | 解決策 |
---|---|
null が返る |
JSPフォームの enctype が multipart/form-data になっていない |
ファイルが保存されない | 書き込み権限やパスの誤りに注意 |
アップロードサイズ制限エラー |
maximumSize パラメータやTomcat側の maxPostSize に注意 |
✅ 7. アップロード成功画面(uploadSuccess.jsp)
<h2>アップロード成功</h2>
<p>ファイル <strong>${uploadFileName}</strong> を正常にアップロードしました。</p>
✅ 8. まとめ
ポイント | 内容 |
---|---|
Struts2は fileUpload インターセプターでアップロードに対応 |
|
File , String uploadFileName , String contentType のセットが基本 |
|
multipart/form-data は忘れずに |
|
セキュリティ上の配慮を怠らない(サイズ制限、拡張子制限、保存場所) |
▶️ 次回予告:Vol.11.18 フォーム入力チェックのバリデーション設計
OGNL式・バリデータXML・Javaコードを使い分けて、確実に入力チェックを実装する方法を紹介します!
🧭 関連記事(Vol.11.xxxシリーズ)
連番 | タイトル | 内容分類 |
---|---|---|
Vol.11.0 | Struts2が提供してくれる便利機能まとめ9選 | 導入&概要 |
Vol.11.1 | 自動注入とステートレスActionの仕組み | フレームワーク内部理解 |
Vol.11.2 | UX改善に効く!アクション層設計と入力制御の極意(プロローグ) | UX設計・アクション層総論 |
Vol.11.2.1 | 【実践編】Struts2アクション層の役割と設計パターン(Command型 / UIアクション分離など) | アクション設計パターン |
Vol.11.2.2 | 【UX重視】戻るボタン・キャンセル処理の設計手法と「戻り先管理」のスマート実装 | 戻り先制御とUX設計 |
Vol.11.2.3 | 【設計ノウハウ】多画面遷移時のパラメータ受け渡し・保持戦略(セッション vs hidden vs URL) | パラメータ多重管理 |
Vol.11.2.4 | 【実践ガイド】ユーザー操作を考慮したアクション遷移設計(リダイレクト vs フォワードの使い分け) | UX遷移設計/Result制御 |
Vol.11.2.5 | 【トラブル防止】アクション層の共通処理とメンテナブルなBaseAction設計 | アクション共通化/保守性 |
Vol.11.3 | Struts2の defaultStack とは?Interceptorの中身を詳しく追ってみる | Interceptor |
Vol.11.3.2 | 🔧 Vol.11.3.2 独自Interceptorの作り方と使い所 Struts2のカスタマイズを“実践で使えるレベル”に一歩進めよう | Interceptor |
Vol.11.4 | 入門者のための「パラメータ自動バインディング」完全理解ガイド | 自動バインディング |
Vol.Vol.11.4.1 | 入門者のための自動バインディング実践パターン集 | 自動バインディング |
Vol.11.5 | Struts2の構成理解が“実務レベル”へと進化する決定版 | 設定ファイル構造 |
Vol.11.5.1 | Struts2の“画面遷移の全体像”を理解するためのマイルストーン記事 | 設定ファイル構造 |
Vol.11.6 | ActionSupport の便利メソッドと国際化対応 | ユーティリティ / i18n |
Vol.11.7 | validate() / input 戦略とUX設計 | 開発スタイルの違い |
Vol.11.8 | アノテーションベースの設定 vs XML定義の比較 | 開発スタイルの違い |
Vol.11.9 | バリデーション完全解説(XML / アノテーション) | バリデーション(※Vol.8補完) |
Vol.11.10 | Struts2の「OGNL」ってなに?しくみと使い方をやさしく解説 | 式言語OGNL解説 |
Vol.11.11 | ModelDriven インターフェースの使いどころと注意点 | Model駆動開発 |
Vol.11.12 | SessionAware と RequestAware でセッション/リクエスト管理 | セッション管理 |
Vol.11.13 | Resultタイプ完全解説(dispatcher / redirect / stream など) | 遷移パターン理解 |
Vol.11.14 | Vol.11.14 ValueStackの中身を理解する – 画面とActionの橋渡し役 | Action |
Vol.11.15 | Interceptorチェーンを自作してみよう(ログ / 認証フィルタ) | Interceptor |
Vol.11.16 | エラー処理と例外ハンドリングの実践パターン | ハンドリング設計 |
Vol.11.18 | 非同期通信(AJAX)とStruts2の連携方法 | フロント連携編 |
Vol.11.19 | セキュリティ対策(CSRF, XSS, パラメータ偽装) | セキュリティ対策 |
Vol.11.20 | 複数フォームを安全に扱う!セッション管理と動的フォームの考え方 | セッション管理 |
Vol.11.21 | Struts2でJSONを返す!REST API連携と非同期通信の基本設計 | セッション管理 |
Vol.11.22 | 本番環境構成とセキュリティ設計(Apache+Tomcat+Struts2連携) | 外部公開 |