0

ユーザーが複数のファイルをバックエンド サーバーに送信できるサーブレット ベースのフォームを作成しようとしています。

フォームは、いくつかのファイル セレクターで構成されています。

フォームは 1 つのサーブレットから送信され、出力ストリームに text/html として出力されます。(ページの多くは、ユーザーがログインしているかどうかなどに依存しています。)

ブラウザでは、html は次のようになります。

 <form action="https://localhost:8441/uploadtest" method="post" enctype="multipart/form-data" >

1 つ以上のファイルを選択して送信ボタンをクリックすると、リクエストは正しいリンクに転送されますが、request.getContentType() が null であるため、ファイル アップロード ハンドラはデータを処理できません。

組み込みの jetty 9 サーバーを使用して、サーブレットをホストしています。サーブレット API のバージョンは 3.0 です。ハンドラーは、コンテンツ タイプが null であることを示す例外をスローします。これは、デバッグ用に追加した print ステートメントの出力によっても確認されます。

数時間問題を検索して探していましたが、フォームが enctype を multipart/form-data として POST リクエストを送信したにもかかわらず、コンテンツ タイプが null に設定されている理由がわかりません。

ハンドラー コードは次のとおりです。

    @Override
public void doHandle(String target, Request baseRequest, HttpServletRequest request,
        HttpServletResponse response) throws IOException, ServletException {

    String contentType = request.getContentType();
    System.out.println(contentType);
    if (contentType != null && contentType.startsWith("multipart/form-data")) {
        baseRequest.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, MULTI_PART_CONFIG);
    }
            //processing here.
4

2 に答える 2

0
public void doHandle(String target, Request baseRequest, HttpServletRequest request,
        HttpServletResponse response) throws IOException, ServletException {}

ここであなたが使用したのはあなたが使用doHandleした形と同じでしたmethod="post"

于 2013-10-13T20:09:49.377 に答える
0

解決:

firebug を使用して、HTML 部分がフォームを正しく送信したことを確認できました。アプリケーション全体を何も削除した後、Jetty 9 サーバーに到着した後、それを処理するハンドラーに到着する前に、リクエストが失われていたことが判明しました。

サーバー上の最初のハンドラーとしてハンドラーを「/」パスにマッピングすることで、なんとか「修正」しました。リクエストを解析するとき、宛先パスが「/files」であるかどうか、およびそれが multipart/form-data であるかどうかをチェックします。そうであればそれを処理し、そうでなければリクエストを無視します。

この時点で、jetty のデフォルト処理は、フォーム以外のリクエストをサーバー上の残りのハンドラーに適切に転送します。

これは少しハックです。ファイル ハンドラを「/files」(または任意の) URL にマッピングするとリクエストが失われる理由を誰かが教えてくれれば、それは素晴らしいことですが、少なくとも今のところは機能しています。

誰かが同じ問題を抱えている場合に備えて、サーバー構成の関連ビットのコードを次に示します。

    ContextHandlerCollection contexts = new ContextHandlerCollection();
    server.setHandler(contexts);
    new FileUploadHandler(contexts,"/");
    ServletContextHandler root = new ServletContextHandler(contexts,"/");
            //more servlets & handlers here. 

およびハンドラー自体:

 HttpServletResponse response) throws IOException, ServletException {
    if (!request.getPathInfo().equals("/files")) {
        return;
    }
    System.out.println(request.getContentLength());
    if (request.getContentType() != null && request.getContentType().startsWith("multipart/form-data")) {
        baseRequest.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, MULTI_PART_CONFIG);
    } else {    
        response.sendRedirect(URL.INDEX.getURL());
    }
              //more processing here
于 2013-10-14T21:53:57.273 に答える