the request doesn't contain a multiiPad/form-data or multiiPad/form-data stream、content type header

4548 ワード

the request doesn't contain a multiiPad/form-data or multiiPad/form-data stream、content type header
 
一、HTTPアップロードの基本知識      
         Form元素の文法では、EncTypeはデータを提出するフォーマットがEncype属性で指定されていることを示しています。データをサーバに返送する際に使用するコードの種類を指定します。フォームデータは名前/値ペアとして符号化されます。これは標準的なコードフォーマットです。multiipad/form-data:フォームデータはメッセージとして符号化され、ページ上の各コントロール対応メッセージの一部です。text/plin:フォームデータはすべてのコントロールまたは書式文字を含まないテキスト形式で符号化されます。補足formのenctype属性は符号化方式としてよく使われています。aplication/x-wn-urlencodedとmultiad/form-dataは標準ではappication/x-wn-urlencodedです。
         actionがgetの場合、ブラウザはx-wn-form-urlencodedの符号化方式でformデータを一文字列に変換して、この文字列をurlの後ろに使ってください。この新しいurlをロードします。
         actionがpostの場合、ブラウザはformデータをhttp bodyにパッケージし、serverに送信します。
        type=fileのコントロールがない場合は、デフォルトのアプリ/x-www-form-urlencodedを使えばいいです。ただし、type=fileがあれば、multiiPad/form-dataを使います。ブラウザはフォーム全体をコントロール単位で分割し、各部分にConteet Displation(form-dataまたはfile)、Conteet-Type(デフォルトはtext/plin)、name(コントロールname)などの情報を加えて分割符(boundary)を付けます。
二、使用中の注意点
       AJAXでサーバーにデータをアップロードすると、content-typeがaplication/x-wn-form-urlencodedに設定されていますが、このときは全体の送信内容をエンコードしています。名前に対応する値をエンコードしたわけではありません。したがって、サーバー側では、request.get Parameter(name)という方法で値を取ることが問題になります。
       二つの解法があります。
       1)サーバー側を変更する:ストリーム方式でハードコード化する
          
        InputStream stream = request.getInputStream();
        InputStreamReader isr = new InputStreamReader(stream);
        BufferedReader br = new BufferedReader(isr);
        String str = br.readLine();
        System.out.println(str);

        str = URLDecoder.decode(str, "gb2312");
        System.out.println(str);
        br.close();
 
         2)クライアントの変更:データ送信構造の変更
             サーバーにデータを送る時は、name=escapeの方式でグループを組みます。
              このときサーバコードでは、request.get Parameeter(name)で得られた値は符号化しなくてもいいです。
 
actionがgetの場合、ブラウザはx-wn-form-urlencodedの符号化方式でformデータを一文字列に変換して、この文字列appndをurlの後ろに使ってください。この新しいurlをロードします。 actionがpostの場合、ブラウザはformデータをhttp bodyにパッケージし、serverに送信します。 type=fileのコントロールがない場合は、デフォルトのアプリ/x-www-form-urlencodedを使えばいいです。 ただし、type=fileがあれば、multiiPad/form-dataを使います。ブラウザはフォーム全体をコントロール単位で分割し、各部分にConteet Displation(form-dataまたはfile)、Conteet-Type(デフォルトはtext/plin)、name(コントロールname)などの情報を加えて分割符(boundary)を付けます。 以下のformがあれば、file 1.txtを選択してアップロードします。 
<form action="http://server.com/cgi/handle" 
       enctype="multipart/form-data" 
       method="post"> 
   <input type="text" name="submit-name" value="chmod777"><br /> 
   What files are you sending? <input type="file" name="files"><br /> 
form> 
 
次のbodyがあります 
Content-Type: multipart/form-data; boundary=AaB03x 

   --AaB03x 
   Content-Disposition: form-data; name="submit-name" 

   chmod777 
   --AaB03x 
   Content-Disposition: form-data; name="files"; filename="file1.txt" 
   Content-Type: text/plain 

   ... contents of file1.txt ... 
   --AaB03x--
 
転載先:https://www.cnblogs.com/mjorcen/p/3825851.html