テキストファイルとバイナリファイル
レシピサイトのユーザの管理、レシピの管理をしたりするWebアプリ課題を作成中です。
ユーザ管理をするのはIdとか名前とかを text type="text" で持ってきて
getParameterを使ってServletとかで使っていました。
しかし、レシピ管理の方ではそれが通用しなかった!!
それは画像を使うからです。
画像を使う場合、テキストファイルの使い方で持ってこようとするとエラーになります。
画像は人には読めないようなバイナリファイルを使って処理を行うので
テキストファイルで持ってきたいモノがあっても違うバイナリのやり方で値を持ってこなきゃいけません。
<form action="recipeSave" method="post" enctype="multipart/form-data">
<input type="text" name="recipeTitle" >
<input type="file" name="uploadFile">
<input type="submit" value="保存" name="save">
</from>
保存ボタンを押すとServletに飛びます。
この場合、enctype="multipart/form-data" でバイナリに指定されているため
request.getParameter(); でとってこれません。
私は外部jarを追加してきました。
commons fileUploadと
http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
一緒にcommons ioもライブラリに追加します。
http://commons.apache.org/proper/commons-io/download_io.cgi
あ、それを使うServletのimportもTomcatじゃなくてcommonsにします。
doPostメソッド
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);
私の場合は
ServletからDaoを呼び出します。
Daoのメソッドでは
SQLにコネクションして、実行してから
Dtoに値を入れていきました。
(2つ?のあるSQL文の後)
ps = conn.prepareStatement(sbSQL.toString());
for(FileItem item : items){ //Itemリストをループ
if(item.isFormField()){ //そのリストから出したものがテキストファイルなら
String name = item.getFildName(); //nameをとる↑で言えばtextTitleとか
String val = item.getString("UTF-8"); //テキストの書かれた中身。引数書かないと化ける
switch(name){ //ちなみに文字比較のswitch文はJava7から
case "textTitle" : //nameがtextTitleなら1つめの?にvalを入れる
ps.setString(1, val);
break;
}
} else { //バイナリファイルなら
ps.setBlob(2, item.getInputStream()); //2つめの?に画像を入れる
}
}
って感じでしたー。