0

JSPページとサーブレットがあります。JSPには2つの入力があり、1つはファイル、もう1つはテキスト入力です。ユーザーが[送信]ボタンをクリックすると、フォームアクションはサーブレットのdo Post()を指します。 ()コードを2つの部分に分割しました。1つはJspページからテキスト入力とファイル名を取得し、もう1つはファイルをバイトに変換します。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
                                                                                    IOException {
    response.setContentType(CONTENT_TYPE);
    PrintWriter out = response.getWriter();

    //This is 1st part
    //For Converting the File into Stream of Bytes
    String contentType = request.getContentType();
    //System.out.println("Content type is :: " +contentType);

    if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) {
        DataInputStream in = new DataInputStream(request.getInputStream());
        int formDataLength = request.getContentLength();
        byte dataBytes[] = new byte[formDataLength];
        int byteRead = 0;
        int totalBytesRead = 0;
        int k = -1;
        while (totalBytesRead < formDataLength) {
            byteRead = in.read(dataBytes, totalBytesRead, formDataLength);

            totalBytesRead += byteRead;
            //System.out.println(dataBytes[++k]);

        }
        for (int i = 0; i < formDataLength; i++) {
            System.out.print((char)dataBytes[i]);

        }

        System.out.println("Converted");
        out.println("<HTML>");
        out.println("<HEAD>");
        out.println("</HEAD>");
        out.println("<BODY>");
        out.println("<H1>UPLOADED FILE</H1>");
        out.println("<BODY>");
        out.println("</HTML>");
    } else
        System.out.println("asa");


    //This is the 2nd part
    // Create a new file upload handler
    DiskFileUpload upload = new DiskFileUpload();

    // parse request
    List items = null;

    // get uploaded file
    try {
        items = upload.parseRequest(request);
    } catch (FileUploadException e) {
    }
    FileItem file = (FileItem)items.GET(1);
    String DocTitle = file.getName();

    int len = DocTitle.length(), pos = 0, j = 2;
    for (int i = 0; i < len; i++) {

        if (DocTitle.charAt(i) == 46) {
            pos = i;

        }

    }

    String s = DocTitle.substring(pos + 1, len);
    System.out.println("TheContent Type is: " + s);

    // get taget filename
    FileItem name = (FileItem)items.get(1);
    String fileName = name.getString();
    System.out.println("Filename: " + fileName + "." + s);

}

問題は、コードが機能するのは第1部または第2部のみであるが、一緒に実行すると機能しないように見える場合です。両方を組み合わせると、第1部が実行され、第2部ではスローされます。

java.lang.IndexOutOfBoundsException:インデックス:0、サイズ:0 at java.util.ArrayList.RangeCheck(ArrayList.java:547)

上記を解決するのを手伝ってください

4

1 に答える 1

1

具体的な間違いは、HTTP リクエストの本文を 2 回読み取ろうとしているということです。request.getInputStream()明らかにそれをstdoutに出力する唯一の目的で初めて使用しました(おそらく不注意なデバッグの試みですか?)。2 回目は Apache Commons FileUpload を使用します。request.getInputStream()ただし、事前に既に使用しているため、によって完全に空のリクエスト本文が取得されます。(Apache Commons FileUpload を使用して) 2 回目に読み取ることができるように、クライアントは 2 回目にファイルを再送信するつもりはありません。

その最初のブロックを完全に削除すると、機能するはずです。

ああ、roseindia.net を読むのをやめてください。そのサイトは、誤解を招くコード例のみを示しており、初心者を完全に混乱させる非常に悪い慣行を教えています.

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

于 2012-09-21T02:48:49.203 に答える