スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Spring MVC ファイルアップロードを実装する[入力チェック編]

ファイルアップロード編の最後になる今回は、ファイルのサイズチェックを行い、指定したサイズを超えた場合、エラーメッセージを表示させてみる。

ファイルアップロードは対応すべき内容が多いので、記事を3回に分けて掲載する。
 ①[DB登録編]Book情報の作成にあたって、タイトル、価格に加えて画像ファイルもDBに登録する
  ⇒Spring MVC ファイルアップロードを実装する[DB登録編]
 ②[DB参照編]登録した画像ファイルを画面に表示させる
  ⇒Spring MVC ファイルアップロードを実装する[DB参照編]
 ③[入力チェック編]ファイルサイズに上限を設け、オーバーした場合は入力チェックエラーとする
  ⇒本記事

◎動作検証にあたっての各バージョンは以下の通り
  • SpringFramework 3.2.8.RELEASE
  • Java 1.7
  • Tomcat 7.0

1.messages_ja.properties

NotEmpty={0} は必須入力です
bookId=ID
bookName=タイトル
price=価格
cover=カバー
welcome=ようこそ!!
error.fileSize=ファイルサイズが{0}バイトを超えています

「error.fileSize」が今回追加したエラーコードとなる。{0}に指定したファイルサイズが埋め込まれる。
また、掲載はしないが、messages_en.propertiesに英語のエラーメッセージを設定する。
■国際化対応に関する過去の記事
Spring MVC メッセージの国際化に対応する

2.BookForm.java(関連箇所のみ掲載)

public class BookForm implements Serializable {

private static final long serialVersionUID = 1L;

private String bookId;

@NotEmpty
private String bookName;

@Min(1)
private String price;

private byte[] cover;

//getter・setterは省略

前回までと変更はないが、参考として掲載。

3.BookController.java(関連箇所のみ掲載)

@Controller
@RequestMapping("/book")
public class BookController {

//省略

@RequestMapping(value = "/create", method = RequestMethod.POST)
public String create(@Valid BookForm form, BindingResult result, Model model,
     @RequestParam(value="uploadFile",required=false) MultipartFile file) {

logger.info("create start");
//TODO 50000はプロパティファイルより取得するよう変更
if (file.getSize() > 50000) {
result.rejectValue("cover", "error.fileSize",
                  new Object[]{50000},"File size error");
}
if (result.hasErrors()) {
return "newBook";
}

if (!file.isEmpty()) {
byte[] fileContent = null;
InputStream is = null;
try {
is = file.getInputStream();
fileContent = IOUtils.toByteArray(is);
form.setCover(fileContent);
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(is);
}
}

BookEntity entity = BookUtil.copyProperties(form);
bookService.addEntity(entity);
model.addAttribute("book", entity);
return "result";
}
}

「file.getSize() > 50000」にて、ファイルサイズが50Kバイトより大きいかをチェックしている。(未入力時のfile.getSize()は0)次行のrejectValueメソッドでは、第1引数にフィールド名(今回の場合、BookForm.javaの「cover」)、第2引数にエラーコード、第3引数にエラーメッセージにバインドする値、そして最後の引数には、該当するメッセージが見つからなかった場合に表示されるデフォルトのエラーメッセージを設定している。試しにプロパティファイルのエラーコードを「error.fileSize」→「error.filesize」に変更すると、エラーメッセージに「File size error」が表示される。また、第3引数のバインドする値であるが、new Object[]{50000}と数値を設定すると、メッセージは「50,000」と3桁区切りで表示される。(「5.登録画面」参照。ちなみにnew Object[]{"50000"}とした場合は、50000と表示された。)このrejectValueメソッドを使うことにより、フィールドに対するエラーメッセージを設定することができる。また、ファイルサイズチェックを「if (result.hasErrors()) 」の前に置くことにより、ファイルサイズエラーの場合でも、入力チェックエラーと判定されるようにしている。

4.newBook.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<link href="<c:url value="/css/bootstrap.min.css" />" rel="stylesheet">
<link href="<c:url value="/css/bootstrap-theme.min.css" />" rel="stylesheet">
<script src="<c:url value="/js/bootstrap.min.js" />"></script>

<title>newBook</title>
</head>
<body>
<spring:message code="bookName" var="varBookName"/>
<spring:message code="price" var="varPrice"/>
<spring:message code="cover" var="varCover"/>

<div class="container-fluid">
<form:form
action="${pageContext.request.contextPath}/book/create"
method="post" modelAttribute="bookForm" class="well" enctype="multipart/form-data">
<div class="form-group">
<form:label path="bookName" class="control-label">${varBookName}</form:label>
<form:input path="bookName" class="form-control"/>
<p class="help-block"><font color="red"><form:errors path="bookName" /></font></p>
</div>
<div class="form-group">
<form:label path="price" class="control-label">${varPrice}</form:label>
<form:input path="price" class="form-control"/>
<p class="help-block"><font color="red"><form:errors path="price" /></font></p>
</div>
<div class="form-group">
<label for="uploadFile" class="control-label">${varCover}</label>
<input name="uploadFile" type="file" class="form-control"/>
<p class="help-block"><font color="red"><form:errors path="cover" /></font></p>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary"/>
</div>
</form:form>
</div>
</body>
</html>

他の項目と同じように「form:errors path="cover"」とするだけでよい。

5.登録画面
①ファイルサイズのみエラーの場合
ファイルサイズエラー2

②複数項目がエラーの場合
ファイルサイズエラー

ファイルサイズチェックが実装されていることが確認できた。

3回に渡って掲載したファイルアップロード機能は、いろいろ考えることが多かったが、その分得られるものも多い題材だった。

■過去のSpring関連記事
Spring関連記事 Index


スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

bookmount8

Author:bookmount8
システムエンジニア。サーバーサイドでjavaを扱うことが多い。最近は、ミドルやフロント周りも関心あり。

最新記事
カテゴリ
検索フォーム
最新コメント
月別アーカイブ
これまでの訪問者数
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。