2013-08-14 23 views
5

jquery ajax投稿を入力タイプのファイルとテキスト付きの通常の入力タイプで行い、request.getParameter("element_name")でサーブレットから取得しようとしていますが、Chromeのインスペクタを使用すると、私が送信しているFormDataのオブジェクトにファイルとテキストの値が含まれている場合、servletは何らかの理由でnullというパラメータを読み取っています。入力タイプとファイルを持つFormDataオブジェクトを投稿するNullPointerException

この私が持っているフォームがされています(TICKET_IDは別のJSPから成功裏に戻っている)

<form id="upload-form" action="upload" enctype="multipart/form-data" method="post"> 
    <input id="attach-btn" type="file" name="uploadedFile" style="display:none"/> 
    <input id="tick-id-upload" type="hidden" name="ID" value="<%=ticket_id%>" />    
    <input id="submit-form" type="button" style="display:none"/> 
</form> 

これはjqueryのAjaxのポストコールです:

// use to refresh section on submit of a form 
$(document).on('click', '#submit-form', function() 
{ 
    var form_data = null; 

    if (drop === false) 
    { 
     // form data object with ticket id and file 
     form_data = new FormData($('#upload-form')[0]); 
    } 
    else 
    { 
     // append dropped file and value of id seperately 
     form_data = new FormData(); 
      form_data.append('ID', $('#tick-id-upload').val()); 
     form_data.append('uploadedFile', dropped_files); 
    } 

    $.ajax(
    { 
     url: $('#upload-form').attr('action'), 
     type: 'POST', 
     async: true, 
     xhr: function() // custom XMLHttpRequest 
     { 
      myXhr = $.ajaxSettings.xhr(); 

      if (myXhr.upload) 
      { // check if upload property exists 
       myXhr.upload.addEventListener('progress', show_progress, false); // for handling the progress of the upload 
      } 
      return myXhr; 
     }, 
     dataType: 'html', // the data type to be returned 
     success: function(response, status, xhr) 
     { 
      $('#progressbar').hide(); 

      if (xhr.getResponseHeader('duplicate') === 'true') 
      { 
       // file is duplicate.. display dialog box 
      setTimeout(function() 
      { 
        $('#trigger-dialog').trigger('click'); 
      }, 10);  
      } 
      else 
      { 
       // replace attachments section by section in response 
        $('#attachments').html($(response).find('#attachments').html()); 
        execute_attach_datatable(); 
        switch_to_view(); 

        init_progress_bar(); 
        override_section_height(); 
       } 
      }, 
      error: function(xhr, status, error) 
      { 
       alert(xhr.responseText); 
      }, 
      data: form_data , // what data to pass 
      cache: false, 
      contentType: false, // type of data to be sent 
      processData: false 
     }); 
    }); 

そして、これは何ですか私は自分のサーブレットのdoPostメソッドで行います:

int ticket_id = Integer.parseInt(request.getParameter("ID")); 

この行は、Chromeのネットワークセクションからデータが送信されていますが、NullPointerExceptionを返しています。

入力タイプのテキストを送信せずにファイルをアップロードしても問題はありませんのでご注意ください。つまり、tick-id-upload要素を持たない同じフォームがあり、同じjquery ajax呼び出しを使用すると、ファイルが正常にアップロードされます。

何が起こっているのでしょうか?どうもありがとう!

答えて

3

request.getParameter()を使用して、multipart/formリクエストパラメータを直接読み取ることはできません。代わりに、getPartメソッドを使用して、mulitpartリクエストのさまざまな部分を読み取る必要があります。ここでは、あなたのマルチパートリクエストの部品を反復処理することができる方法である。

for (Part part : request.getParts()) { 
} 

は、詳細な例については、このブログに従ってください:http://balusc.blogspot.in/2009/12/uploading-files-in-servlet-30.html

+0

ああ知らなかったというあなたの答えに感謝!ブログは本当に詳細なので、私はそれに簡単に従うことができます。もう一度ありがとう:) – Bernice

+0

@Berniceいいえprobs :-)あなたが私の答えを見つけるなら、それを受け入れてください。答えを受け入れることで他の人が同じ問題に直面するのを助けます。 –

+0

この解決策とは別に、JavaでFileItemクラスを使用して、要求を解析してファイルまたはアイテムの両方を取得できることに注意してください:)これを他のユーザーの別の回答として入れるべきかどうかはわかりません – Bernice

関連する問題