JSPでのファイルアップロードとデータ受け取りに関する問題

このQ&Aのポイント
  • ファイルアップロードにてJSPで入力したFORMデータと画像ファイルのアップロードをひとつのサブミットボタンで同時にリクエストでサーブレットへ送るような会員登録ページのプログラムを作っているのですが、サーブレット側で受け取ったデータが文字化けしてしまいます(下のソース中のparaValueの部分)。また受け取るファイルを画像ファイル(gifかjpeg)をかどうか判別してオッケーなら指定の場所へ登録し違うものなら削除するような機能も考えています。
  • (サブミットを実行する前にjavascriptなどで判別が出来ればいいのですが)誰か知恵を貸してください。
  • フォームからのデータと画像ファイルのアップロードを同時に行う会員登録ページを作成しているが、サーブレットで受け取ったデータが文字化けしてしまい、画像ファイルの形式判定にも困っている。JavaScriptなどで事前に判定できる方法を知りたい。
回答を見る
  • ベストアンサー

ファイルアップロードにて

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(); } } }

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#219128
noname#219128
回答No.1

とりあえずHTMLにも以下のエンコーディング設定をしてみて下さい。 <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=Shift_JIS">

koking
質問者

お礼

回答ありがとうございます。 指摘のとおりHTMLでも設定してみましたがだめでした。 でも何とか自己解決しました。 javadocをしっかり読んだらエンコードを指定できるメソッドが見つかりました。 どうやらUnicodeからStringをつくる時に失敗していたようです。

関連するQ&A

  • ファイルのアップロードに関して

    PHPでファイルのアップロードをしようと考えていますが、単純に1画面でファイルの選択し、 その画面上のボタンを押した際にアップロードするという事は可能ですが、ボタンを押した後、 次画面(プレビュー)でファイル名を確認し、2画面目のボタンを押した時にアップロードしたい と考えております。 どのように記述したら良いか教えて下さい。 《現状 このままでは正しく動作します》 1画面目 <FORM method="post" name="frm" id="frmid" enctype="multipart/form-data"> <TABLE> <TR><TD width="200">【登録画面】</TD></TR> <?php print("<TR>\n"); print("<TD width='200'>ファイルを選択:</TD>\n"); print("<TD><input type='file' name='upfile'></TD>\n"); print("</TR>\n"); ?> </TABLE> </FORM> 2画面目 <?php $updir = "//192.168.999.999/doc/"; $filename = $_FILES['upfile']['name']; if(move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename)==FALSE){ print("Upload failed"); print($_FILES['upfile']['error']); }else { print("<b> $filename </b> uploaded"); } ?> 実際は2画面目ではファイル名だけを表示させ、2画面目のボタンを押した際に 取り込み処理を行いたい。 初歩的な質問で申し訳ありませんが、教えて下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • ファイルアップロードについて

    ファイルアップロードについて質問させて下さい。 ID、ファイルアップロードの機能の2つがあります。 ファイルを指定し、submitボタンを押下すると「b.php」に遷移します。 ファイルをアップロードした場合には遷移をせず ID、画像パスが入力されている場合のみ「b.php」に遷移したいのです。 入力チェックはjavascriptで行っていますが、その場合には「action=""」として javascript側で遷移するしか方法は無いのでしょうか? ---a.php---- <form enctype="multipart/form-data" action="b.php" method="post" name="a"> <input type="hidden" name="MAX_FILE_SIZE" value="50000000" /> <table> <tr> <th>ID</th> <td><input type="text" name="ID" value=""></td> </tr> <tr> <th>画像</th> <td><input type="file" name="img" value=""> <input type="submit" name="upload" value="upload"> </td> </tr> </table> <a href="#" onClick="javascript:check('a');"><img src="button.jpg"></a> </form> お手数ですが、ご教授よろしくお願い致します。

    • ベストアンサー
    • PHP
  • struts2 ファイル アップロード

    今、ファイルのアップロードのプログラム開発を行なっておりますが アップロードのボタンを押すとHTTPステータス500のエラーで実行ができません。 詳しい方、間違っている箇所のご指摘宜しくお願い致します。 プログラムは以下の通りです。(JAVAは一部削除しています) (JSP) <%@ page contentType="text/html; charset=UTF-8" %> <%@ page pageEncoding="Windows-31J" %> <%@taglib prefix="s" uri="/struts-tags" %> <%@taglib prefix="original" uri="/original-tags" %> <%@taglib prefix="originalJK" uri="/original-JK-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> %@ include file="html-head.jsp" %> <script type="text/javascript"> </script> </head> <body onload> <%@ include file="HeaderTitle.jsp" %> <div class="navigation" align="right"> <originalJK:CommonLinkTag mode="2" /><br> </div> <br> <s:form enctype="multipart/form-data"> <table width="100%"> <tr> <td> <INPUT type=file name="upload"> </td> </tr> </table> <table width="100%"> <tr> <td> <s:submit value="EXCELアップロード" cssClass="form_button" action="tEST11A" method="doUpload" onclick="return confirm('アップロードしてよろしいですか。');"/> </td> </tr> </table> </s:form> </body> <html> (JAVA) @ParentPackage(value = "Original") @Results({ @Result(name = "success", value = "jsp/TEST11A.jsp"), @Result(name = "failure", value = "jsp/TEST11A.jsp") }) public class TEST11AAction extends SuperAction { private String aBtnUpdateMsg = ""; private File upload; private String uploadContentType; private String uploadFileName; public String execute() throws Exception { return "success"; } public String doUpload() throws Exception { try { // DBコネクションオープン vDb.open(); TEST11ADao vDao = new TEST11ADao(vDb); int vCount = 0; //データ存在チェック vCount = vDao.dbCntLine(); FileInputStream fis = new FileInputStream(upload); POIFSFileSystem fs = new POIFSFileSystem(fis); // ワークブック・オブジェクトの取得 HSSFWorkbook wb = new HSSFWorkbook(fs); // 総ワークシート数の取得 int sheets = wb.getNumberOfSheets(); // ワークシートごとに、データを取得 int idx = 0; for (int sheetIdx = 0; sheetIdx < sheets; sheetIdx++ ) { //コミット vDb.commit(); } finally { // DBクローズ vDb.close(); } return "success"; } public File getUpload() { return upload; } public void setUpload(File upload) { this.upload = upload; } public String getUploadContentType() { return uploadContentType; } public void setUploadContentType(String uploadContentType) { this.uploadContentType = uploadContentType; } public String getUploadFileName() { return uploadFileName; } public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; }

  • ファイルのアップロードについて

    phpのmove_uploaded_fileを使用してアップロードをしようと思うのですがアップロードが出来ません。 状況は ローカル環境のwindowsでのアップロードは行えるがlinuxでは失敗してしまいます。 move_uploaded_fileからはエラーは出力されていません そもそもmove_uploaded_fileが成功しているのになんでアップロードされていないのか分かりません。 //■HTML <form name="form1" method="post" action="upload.php" ENCTYPE="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="10485760" /> <table class="frm" id="tbl"> <tr><th>ファイル1<div id="image"></div></th> <td> 画像<input id="img_1" type="file" name="image[]" class="fname" onChange=imageChange(this); /><br /> </td></tr> <tr> <th>ファイル2<div id="image"></div></th> <td> 画像<input id="img_2" type="file" name="image[]" class="fname" onChange=imageChange(this); /><br /> </td> </tr> </table> </form> //■phpで以下のコードを実行すると oreach ($_FILES["image"]["error"] as $key => $error) { //複数のファイルをアプロード if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["image"]["tmp_name"][$key]; //テンポラリファイルパス $name = $_FILES["image"]["name"][$key]; //アップロードファイル名 $size = $_FILES["image"]["size"][$key]; //アップロードファイルサイズ $ermsg = $_FILES['image']['error'][$key]; //エラーメッセージ echo "アップロードファイル名".$name."\n" ; echo "アップロードファイルsize" .$size ."\n" ; echo "errmsg= .$ermsg."\n" ; // ファイルアップロード $cnt++; if ( move_uploaded_file($tmp_name, "../1/33/.$cnt."2upload.jpg ")){ //ファイルアップロード echo "アップロード成功 .$ermsg."\n" ; echo "  テンポラリファイル="$tmp_name."\n"; echo "  アップロードファイル="$dir_img."/".$cnt.UPLOAD_FILE_NAME."\n"; } else { echo 1; error_log("upload error! \n", 3, MATCHING_ERROR_LOG); exit; } } } exit; ■結果 アップロードファイル名thum6.jpg アップロードファイルsize=10104 errmsg= 0 アップロード成功   テンポラリファイル=/tmp/phpMvCzgo   アップロードファイル=../1/33/1upload.jpg アップロードファイル名 thum3.jpg アップロードファイルsize=11528 errmsg= 0 アップロード成功   テンポラリファイル=/tmp/php5Q4kIL   アップロードファイル=../1/33/2upload.jpg テンポラリの/tmpは777のため権限に問題ないです php.iniの設定 upload_max_filesize=2m post_max_size=8m memory_limit=128m 今回のアップロードファイルのサイズから問題なし file_uploads=onなので問題ありませんでした これでなにかわかる方いらっしゃいましたら教えてください。

    • ベストアンサー
    • PHP
  • phpでのファイルアップロード

    ファイルのアップロードについてご質問があります。 宜しくお願いします。 基礎phpという本でファイルをアップロードするサンプルがあり、このスクリプトでアップロードされたファイルを格納する『upload』というディレクトリをサーバに作成し、スクリプトを実行して、実際にファイルがアップロードできているかffftpにて『upload』ディレクトリの中を見てみると、なにも表示されませんでした。しかしブラウザから http://myドメイン/upload/ファイル名 にアクセスすると表示されます。 ですのでアップロードはできているがファイルが見えないという状態になっております。また『upload』ディレクトリの削除などもできなくなってしまいます。 サーバの設定が関係しているのかとも思ったのですが、サーバの設定を変更することはできないので、プログラムがわで何とかできないでしょうか? 大変申し訳ありませんが宜しくお願いいたします。 以下がそのコードです。 【up.html】 <html> <head><title>File Uploader</title></head> <body> <form method="post" enctype="multipart/form-data" action="up.php"> <input type="file" name="upfile"> <input type="submit" value="upload"> </form> </body> </html> 【up.php】 <html> <head><title>File Uploader</title></head> <body> <p> file uploader </p> <?php $updir = "./upload/"; $filename = $_FILES['upfile']['name']; if (move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename) == FALSE){ print("Upload failed..."); print($_FILES['upfile']['error']); }else { print("<b>" . $filename . "</b> uploaded!"); } ?> </body> </html>

    • ベストアンサー
    • PHP
  • 固定パスでアップロードする場合

    通常ファイルをアップロードする場合、 test.html ---------------------------------------- <form action="upload_test.cgi" method="post" enctype="multipart/form-data"> <input type="file" name="filename" > <input type="submit" value="送信" > </form> ---------------------------------------- upload_test.cgi ---------------------------------------- my ($query,$filename,$mimetype); $filename = $query->param('filename'); $mimetype = $query->uploadInfo($filename)->{'Content-Type'}; ---------------------------------------- ・・・こんな感じに cgi 側でアップしたいファイルの フルパスを受け取ると思いますが、 test.html で、ファイル名をその際選択せずに、 固定の( できれば hidden で ) textタイプ <input type="text" name="filename" value="C:\Documents and Settings\xxxx\デスクトップ\UP.htm" > という具合で upload_test.cgi にうまくファイルのフルパスを渡すにはどうしたらいいのでしょうか。

    • ベストアンサー
    • Perl
  • バイナリファイルのアップロード

    とあるサイトのマルチパートリクエストの使用事例をそのまま使って153KB程度のGIFファイルをアップロード実験してみましたら、処理後ブラウザで「cgi-lib.pl: Request to receive too much data: 153345 bytes 」と表示されアップロードされません。表示の意味と、どうすればアップロードできるかを教えてください。 ● サンプルHTML <html> <head><title>ファイルアップロード</title></head> <body> <form method="POST" action="upload.cgi" enctype="multipart/form-data"> <input type="file" name="upload"> <input type="submit" value="送信"> </form> </body></html> ● サンプルCGI require "cgi-lib.pl"; &ReadParse; $upload = $in{"upload"}; # ファイル内容を取得 $name = $incfn{"upload"}; # ファイル名を取得 $name =~ s/\\/\//g; # パス区切り文字を/に変換 $name = substr($name,rindex($name,"/")+1); # ファイル名のみを取得 if($upload ne "" && $name ne ""){ open(FILE,">$name"); binmode(FILE); print FILE $upload; close(FILE); }

    • ベストアンサー
    • Perl
  • POSTによるファイル・アップロード、ファイルが2回送信される。

    POSTによるファイル・アップロード、ファイルが2回送信される。 <form method="POST" action="file_up.cgi" enctype="multipart/form-data" target="_blank"><table width="650" border="0" cellspacing="3" cellpadding="3" bgcolor="#AAAAFF" align="center"> <tr align="center"><td colspan="2"><b>ファイル・アップロードのサンプル(実験中!)</b></td></tr> <tr><td align="right">ファイル名:</td><td align="left"><input type="file" name="NAME" style="background-color:aqua"></td></tr> <tr><td></td><td><input type="submit" value=" 送信 "><input type="reset" value="クリア"></td></tr></table></form></body></html> 参照ボタンでファイルを選択し、「送信」し、サーバー側でメッセージ・ボディーを見ると選択したファイルが2回送られてきています。 全く無駄な送信だと思うのですが、何か設定があるのでしょうか? それとも仕様でしょうか? 宜しくお願い致します。

    • ベストアンサー
    • HTML
  • ファイルのアップロードとログ

    今日はいつもお世話になっています。 ファイルをアップロードをする際についでにログに名前やアドレス、ファイル名をログに 保存したいなと思っているのですが、なかなかうまくいきません・・・ ファイルをアップロードすることは出来たのですがほかの内容をうまくCGIに渡せなくって 困っています。 どうか宜しくお願いいたします。 use lib './lib'; use CGI_Lite; require 'lib/util.pl'; require 'pl/cgi-lib.pl'; require 'pl/jcode.pl'; $Title = 'ファイルのアップロード サンプル'; $Temp = 'tmp'; $Platform = 'Unix'; $BUFSZ = 2048; $CharSet = 'Shift_JIS'; $upload = new CGI_Lite; $upload->set_directory($Temp) or exitError(" $Temp がオープンできません。"); $upload->set_platform($Platform); $upload->set_buffer_size ($BUFSZ); $filename = $upload->filter_filename(\&convName); $upload->close_all_files; %data = $upload->parse_form_data; if ($upload->is_error()) { exitError($upload->get_error_message());} &ReadParse( *answer ); $num = $answer{'num'} $nam = $answer{'nam'}; $mai = $answer{'mai'}; $file = $answer{'file'}; print <<"EOL"; <HTML><HEAD><TITLE></TITLE></HEAD> <BODY> 整理番号  :$num<br> 名前    :$nam<br> アドレス  :$mai<br> 添付ファイル:$file<br> </BODY> </HTML> EOL exit(0);

    • ベストアンサー
    • CGI
  • Struts2のファイルアップロードにて

    質問させて頂きます。 Struts2にてファイルアップロードの送信フォームを作成したところ Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location] とのエラーが発生してファイルをアップロードすることができませんでした。 ビルドパスはjarファイルを読み込むことでインポートしているのですが、 このエラー文が発生する原因はなんなのでしょうか。 -----------------jsp画面-------------- <s:form name="write" action="doUpload" method="POST" enctype="multipart/form-data"> <s:file name="upload" label="File"/> <s:submit value="アップロード" /> </s:form> ----------------サーブレット------------- public class FileUploadTest extends ActionSupport{ private File upload; private String uploadContentType; private String uploadFileName; private String fileCaption; public String execute() throws Exception { return SUCCESS; } ※各セッターとゲッターは省略 ----------------struts.xml---------------- <action name="doUpload" method="upload" class="DB.FileUploadTest"> <result name="true" >/uploadTest.jsp</result> <result name="error">/uploadForm.jsp</result> </action> と記述しております。 どうかエラー原因のご教授よろしくお願いします。

専門家に質問してみよう