0

私はこのようなフォームを持っています:

  <form id="test" name="test" action="/pages/font/getFontTitle.jsp" method="POST" enctype="multipart/form-data">
    <div class="dialog">
      <table>
        <tbody>
          <tr class="prop"><td valign="top">Name</td><td><input type="text" name="name"></td></tr>
          <tr class="prop"><td valign="top"><input type="file" name="fname" size="62" value="" id="fname"/></td><td><span class="button"><s:submit/></span></td></tr>
        </tbody>
      </table>
    </div> 
  </form>

そして、私のサーブレットは次のようになります:

String contentType=request.getContentType(),Location="0.";
out.println("Done");
System.out.println("contentType = "+contentType);

  boolean isMultipart=ServletFileUpload.isMultipartContent(request);           // Check that we have a file upload request
  System.out.println("isMultipart = "+isMultipart);

  int formDataLength=request.getContentLength();                           // We are taking the length of Content type data
  byte dataBytes[]=new byte[formDataLength];
  System.out.println("dataBytes = "+dataBytes.length+"\n"+dataBytes.toString());

  java.util.Map<java.lang.String,java.lang.String[]> ParameterMap=request.getParameterMap();
  Iterator it=ParameterMap.entrySet().iterator();
  while (it.hasNext())
  {
    Map.Entry pair=(Map.Entry)it.next();
    System.out.println(pair.getKey()+" = "+(pair.getValue()).toString());
//    it.remove(); // avoids a ConcurrentModificationException
  }
  System.out.println("request = \n"+request.getParameterNames().toString());

  if (isMultipart)
  {
    FileItemFactory factory=new DiskFileItemFactory();
    ServletFileUpload upload=new ServletFileUpload(factory);
    List items=null;
Location+="1.";
    try { items=upload.parseRequest(request); }
    catch (FileUploadException e) { e.printStackTrace(); }
    Location+="2.";
    Iterator itr=items.iterator();
    Location+="3.";
    while (itr.hasNext()) 
    {
        Location+="4.";
      FileItem item=(FileItem)itr.next();
      if (item.isFormField())
      {
        String name=item.getFieldName(),value=item.getString();
        System.out.println("name = "+name+"  value = "+value);
        Location+="5.";
      }
      else
      {
        try
        {
          Location+="6.";
          String itemName=item.getName(),savedFilePath=itemName;
          File savedFile=new File(savedFilePath);
          System.out.println("savedFile = "+savedFile.getAbsolutePath());
          item.write(savedFile);
        }
        catch (Exception e) { e.printStackTrace(); }
      }
    }
  }
Location+="e.";

  out.println(" [ "+Location+" ]");
  out.flush();

私が得た結果は次のとおりです。

contentType = multipart/form-data; boundary=---------------------------15890672924370
isMultipart = true
dataBytes = 35909
[B@14d3ba9
name = [Ljava.lang.String;@187f9d7
request = 
java.util.Vector$1@23ca6e

dataBytes にはファイルが含まれていますが、while (itr.hasNext()) ループに入ることはありませんでした。jsp の出力は次のとおりでした: Done [ 0.1.2.3.e. ] 、ロケーション 4、5、6 には到達しませんでした。

[1]なぜ?[2] "dataBytes = [B@14d3ba9" を読み取り可能なものまたはファイルに変換する方法は? [3] "name = [Ljava.lang.String;@187f9d7" を元の文字列値に変換するには? [4] 「(pair.getValue()).toString()」を使用していますが、なぜ読み取り可能な文字列ではないのですか?

4

3 に答える 3

1

クライアントは、HTTP 要求本文を 1 回だけ送信します。

ただし、コードはリクエスト本文を 2 回読み取ろうとしています。getParameterMap()電話による初回:

java.util.Map<java.lang.String,java.lang.String[]> ParameterMap=request.getParameterMap();

2 回目は Apache Commons FileUpload によるものです (空のリクエストに直面します):

try { items=upload.parseRequest(request); }

これはうまくいきません。

標準のサーブレット API メソッドを使用する Apache Commons FileUpload のみを使用します。

以下も参照してください。

于 2012-10-15T22:00:04.823 に答える
0

使用は servelt 3.0 仕様を使用し、それに応じてサーブレットに注釈を付ける必要があります。その後request.getParts()、すべてのマルチパート データを使用できます。それについて読んでください。

于 2012-10-15T20:23:38.267 に答える
0

サブ質問 1,3,4: Servlet 3.0 で追加されたファイル アップロード機能を使用できない場合は、多かれ少なかれファイルをサーブレットにアップロードするためのデファクト スタンダードであるCommons Fileuploadを使用する方がよいと思います。堅牢で、十分にテストされており、機能します。

サブ質問 2: ServletRequest の getParameterMap の Javadoc には次のように記載されています。

パラメータ名をキーとして、パラメータ値をマップ値として含む不変の java.util.Map。パラメータ マップのキーは String 型です。パラメータ マップの値は、String 配列型です。

強調が追加されました: 返される値は文字列ではなく、文字列の配列です。そのため、奇妙な出力値が得られます。試す

System.out.println( pair.getKey()+" = "+ pair.getValue()[0] );

ただし、サーブレットでロガーを使用することも検討してください。System.out にダンプするよりも良い方法です。

ps: おそらく IDE で利用可能なコード フォーマット機能を使用してください。コードはかなり読みにくいものです。

于 2012-10-15T20:27:55.097 に答える