2017-10-26 12 views
2

ネットワーク経由で複数のデータストリームを読み込み、これらの複数のファイルすべてを組み合わせてネットワークにファイルを書き込む機能が必要です。ZipOutputStream to network

ファイルが非常に大きくなる可能性があるので、私はローカルIOファイル操作を実行するのではなく、データストリームを操作したいと考えています。 ネットワークからストリームを読み込み、ストリームをzip形式でネットワークに書き込みます。

私は以下のサンプルコードを試していますが、リモートホストに書き込まれているファイルはありません。 ネットワーク経由で書き込む代わりに、FileInputStreamを使用すると、ローカルディスクファイルへの書き込みが機能します。

ネットワークへの書き込みには何が欠けていますか?

InputStream input = new URL("http://www.cacr.caltech.edu/projects/danse/talks/kickoff/07-Butler/SANS_DANSEkickoffAug06.pdf").openStream(); 



    URL url = new URL("http://posttestserver.com/post.php?dir=ziptest"); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setRequestMethod("POST"); 
    connection.setDoOutput(true); 
    connection.setDoInput(true); 

    ZipOutputStream zipOutputStream = new ZipOutputStream(connection.getOutputStream()); 



    zipOutputStream.putNextEntry(new ZipEntry("1.pdf")); 

    byte[] buffer = new byte[0xFFFF]; 



    for (int len; (len = input.read(buffer)) != -1;) { 
     zipOutputStream.write(buffer, 0, len); 
    } 


    zipOutputStream.putNextEntry(new ZipEntry("2.pdf")); 

    InputStream input1 = new URL("http://www.pdf995.com/samples/pdf.pdf").openStream(); 

    for (int len; (len = input1.read(buffer)) != -1;) { 
     zipOutputStream.write(buffer, 0, len); 
    } 



    zipOutputStream.close(); 

    int responseCode = connection.getResponseCode(); 
    System.out.println("HTTP response code="+responseCode); 

    connection.disconnect(); 
+0

あなたは 'ZipOutputStream.closeEntry()'を呼び出していません。ループの後でフラッシュしてください。私はhttp://posttestserver.com/data/2017/10/26/ziptest/で3つのファイルを見ることができますが、少し短く見えます。 – EJP

+0

@EJP 'putNextEntry()'と 'close()'は、必要に応じて 'closeEntry()'を自動的に呼び出します。 --- 'flush()'する必要はありません。 – Andreas

+0

@Andreas同意しました。確かに内部ループではありません。 – EJP

答えて

1

実際には何も起こりません。まだ

int responseCode = connection.getResponseCode(); 
System.out.println("HTTP response code="+responseCode); 

ベター、必要に応じて、入力またはエラーストリームを読んで、それを閉じて:あなたは、少なくともHTTPレスポンスコードを取得する必要があります。

EDITあなたはファイルの検討を検討しましたか?ここで作成したのは次のとおりです。

Time: Thu, 26 Oct 17 05:36:04 +0000 
Source ip: 107.23.92.82 

Headers (Some may be inserted by server) 
HTTP_ACCEPT_LANGUAGE = en 
HTTP_HOST = posttestserver.com 
HTTP_CONNECTION = Keep-Alive 
HTTP_USER_AGENT = Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5 
HTTP_ACCEPT_ENCODING = gzip,deflate 
REMOTE_ADDR = 107.23.92.82 
DOCUMENT_ROOT = /var/www/html 
REQUEST_SCHEME = http 
CONTEXT_PREFIX = 
CONTEXT_DOCUMENT_ROOT = /var/www/html 
REMOTE_PORT = 52482 
GATEWAY_INTERFACE = CGI/1.1 
REQUEST_METHOD = GET 
QUERY_STRING = dir=ziptest 
REQUEST_URI = /post.php?dir=ziptest 
PHP_SELF = /post.php 
REQUEST_TIME_FLOAT = 1508996164.351 
REQUEST_TIME = 1508996164 

No Post Params. 
Empty post body. 

名前と値のペアのパラメータとして本文を記述する必要があります。 'zipfile = .................'次のバイナリデータをどのように再生するかは、誰でも推測できます。厳密に言えば、データをURLエンコードする必要があります。しかし、本当に必要となるのは、ターゲットシステムの動作に依存します。 POSTの代わりにPUTを使用しているはずです。

+0

レスポンスコードを200として取得しますが、http://posttestserver.com/data/2017/10/26/ziptest/ –

+0

にはファイルがありません。サイズ制限が発生している可能性があります。もっと小さなものを試してみてください – EJP

+0

小さなPDFを使用しましたが、まだ運がありません。 –