2011-07-19 16 views
0

HTTP経由でPOSTリクエストを受け取るHTTPサーバーを書きました。 ------------------javaでHTTPポスト経由でファイルを受け取っています:ファイルが壊れています

:すべての入力フォームでencriptedれるヘッダの後

POST/HTTP/1.1 
Host: 192.168.7.4:5000 
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Connection: keep-alive 
Content-Type: multipart/form-data; boundary=---------------------------197987737412371961922053527775 
Content-Length: 4306786 


-----------------------------197987737412371961922053527775 
Content-Disposition: form-data; name="filename" 

poison.mp3 
-----------------------------197987737412371961922053527775 
Content-Disposition: form-data; name="prova" 

provaV 
-----------------------------197987737412371961922053527775 
Content-Disposition: form-data; name="datafile"; filename="01-Poison.mp3" 
Content-Type: audio/mpeg 

file...... 

:特に、マルチパートフォームデータとして、要求を受信します----------- 197987737412371961922053527775 Conten_disposition ... \ rを\ n個の\ rをする\ nは "入力内容"

最後のものは、バイナリ形式のファイルが含まれています。

これは、ヘッダーに含まれているすべての情報を取得してから、ファイルを再構築しようとする私のサーバーです。 私のローカルマシンからリクエストを送信すると問題なく動作しますが、リモートクライアントからファイルを送信しようとするとファイルが破損します。 ソケットから直接開いた単純なInputStreamを使用しています。

private void payloadFileCreation(InputStream in,boolean t1, FileOutputStream fos, long filesize) throws IOException{ 

    int dyn_data_index=0; 
    int chunk=2048; 
    byte[] dyn_data = new byte[chunk]; 
    int av = in.available(); 
    while (filesize>chunk){ 
      in.read(dyn_data,0,chunk); 
      fos.write(dyn_data,0,chunk); 
     fos.flush(); 
     filesize -= chunk; 

    } 
    in.read(dyn_data,0,(int) filesize); 
    fos.write(dyn_data,0, (int) filesize); 
    fos.flush(); 
    fos.close(); 

    } 

任意のアイデア:

これは、送信されたファイルを作成しようとする方法ですか? ありがとう

+0

腐敗の意味を説明してください。また、2つのマシンはバイトオーダー互換ですか? – g051051

答えて

3

Apache Commons FileUploadライブラリを使用すると、マルチパートフォームリクエストを解析できます。

+0

はい私はそのライブラリを知っていますが、サーバーは投稿要求で非常に巨大なファイル(約Gバイト)を受け取ります。私はこれらのファイルをバッファリングし、含まれているバッファを追加してファイルを作成する必要があります。私は、Apache Commons FileUploadライブラリが最初にオブジェクトにストリームファイル全体を入れようとしているのではないかと心配しています。これは、OutOfMemoryエラーを引き起こす可能性があります。 – Sashimi

+0

恐れてはいけません、Commons FileUploadはこの目的のためにAPIをストリーミングしています:http://commons.apache.org/fileupload/streaming.html –

+0

大丈夫です。 しかし、アプリケーションをサーブレットに実行する必要がありますか?私はそれらのライブラリを見て、彼らはServletFileUpload()を使用しているので、私は自分のスレッドサーバーを持っています 。 ありがとうもう一度 – Sashimi

関連する問題