ファイルアップロードにて
JSPで入力したFORMデータと画像ファイルのアップロードをひとつのサブミットボタンで同時に
リクエストでサーブレットへ送るような会員登録ページのプログラムを作っているのですが、
サーブレット側で受け取ったデータが文字化けしてしまいます(下のソース中のparaValueの部分)。また受け取るファイルを画像ファイル(gifかjpeg)を
かどうか判別してオッケーなら指定の場所へ登録し違うものなら削除するような機能も考えています。
(サブミットを実行する前にjavascriptなどで判別が出来ればいいのですが)誰か知恵を貸してください。
下がソースです。
<!-- jsp ---------------------------------------------->
<%@ page contentType="text/html;charset=Shift_JIS" %>
<html>
<head>
<title>会員登録</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="UploadServlet">
<table border="1">
<tr>
<td align="left">
ユーザーの画像:
<input type="file" name="fl" size="40" />
</td>
</tr>
<tr>
<td align="left">
ユーザーの名前:
<input type="text" name="username" size="40">
</td>
</tr>
<tr>
<td align="center">
<input type="submit" value="アップロード" />
</td>
</tr>
</table>
</form>
</body>
</html>
<!-- servlet ------------------------------------------->
public class UploadServlet extends HttpServlet {
public void doPost(HttpServletRequest req,HttpServletResponse res)
throws ServletException, IOException {
request.setCaracterEncoding("Shift_JIS");
//(1)アップロードファイルを格納するPATHを取得
String path = getServletContext().getRealPath("files");
//(2)ServletFileUploadオブジェクトを生成
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//(3)アップロードする際の基準値を設定
factory.setSizeThreshold(1024);
upload.setSizeMax(-1);
upload.setHeaderEncoding("Shift_JIS");
try {
//(4)ファイルデータ(FileItemオブジェクト)を取得し、
// Listオブジェクトとして返す
List list = upload.parseRequest(req);
//(5)ファイルデータ(FileItemオブジェクト)を順に処理
Iterator iterator = list.iterator();
while(iterator.hasNext()){
FileItem fItem = (FileItem)iterator.next();
//(6)ファイルデータの場合、if内を実行
if(!(fItem.isFormField())){
//(7)ファイルデータのファイル名(PATH名含む)を取得
String fileName = fItem.getName();
if((fileName != null) && (!fileName.equals(""))){
//(8)PATH名を除くファイル名のみを取得
fileName=(new File(fileName)).getName();
//(9)ファイルデータを指定されたファイルに書き出し
fItem.write(new File(path + "/" + fileName));
}
}else {
String paraName=item.getFieldName();
String paraValue=item.getString();
System.out.println(paraName);
System.out.println(paraValue);
}
}
}catch (FileUploadException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
}
補足
私の質問文章が拙く、誤解を招いてしまったみたいです。 質問文にあるファイル選択というのは、添付画像にもある参照ボタンを押した際のフォルダ参照画面での話です。 できる限りのフォルダ整理は行っていますので、エクスプローラや画像ソフト上においてのファイル選択には特に困っておりません。 質問文に上げたイラストSNS、お絵かき掲示板はその他SNSや一般の掲示板と異なり記事ではなく画像が主体となっています。 なので別の場所にアップした画像へのリンクという形はとれません。 こんな都合の良い方法があるかどうかはわからないのですが、私が求めていたのはフォルダ参照のボタンを使用せずに済むような方法、あるいはフルパスを直接入力できれば…っと思っていたのですが、これは読み取り専用エリアの仕組みを考えると少し無理っぽいですね…