2016-03-24 13 views
0

GZIPOutputStreamクラスを使用してイメージをGZIPに変換しています。 GZIPファイルをOutputStream経由で送信しようとすると、破損したファイルが表示されます。私はFileOutputStreamへのGZIPの方法を知っています。次のコードは完璧に動作します:GZIPファイルをJavaで出力してOutputStream経由で送信する方法

Static private void GZIPCompress(String fileName) 
{ 
     File file = new File(fileName); 
     FileInputStream fis = new FileInputStream(file); 
     byte[] data = new byte[(int) file.length()]; 

     fis.read(data); 
     FileOutputStream fos = new FileOutputStream(fileName + ".gz"); 
     GZIPOutputStream gzos = new GZIPOutputStream(fos); 
     gzos.write(data); 
     fos.close(); 
     fis.close(); 
} 

出力ファイルがmyfile.png.gzで、次の詳細があります

myfile.png.gz:FATファイルシステムからのgzip圧縮されたデータを、( MS-DOS、OS/2、 NT)

私は、ファイルをgzipとのOutputStreamに送信しようとすると、私の問題はあります。私はサーバで作業しているので、私はサーバからこれを呼び出しています。ソケットを使用しています。

Static void SendGZIPFile(String fileName, OutputStream os) 
{ 
     DataOutputStream dos = new DataOutputStream(os); 
     File file = new File(fileName); 
     FileInputStream fis = new FileInputStream(file); 
     byte[] data = new byte[(int) file.length()]; 
     byte[] dataAux = new byte[(int) file.length()]; 
     dos.writeBytes("HTTP/1.1 200 OK\r\n"); 
     dos.writeBytes("Content-Type: application/x-gzip \r\n"); 
     dos.writeBytes("Content-Disposition: form-data; filename="+"\""+fileName+".gz"+"\""+"\n"); 
     dos.writeBytes("\r\n\r\n"); 
     dos = new DataOutputStream(new GZIPOutputStream(os)); 
     fis.read(data); 
     dos.write(data); 
     dos.close(); 
     fis.close(); 
     gzos.close(); 
} 

私は何を取得することは何も含まれていない破損したGZIPファイルは次のとおりです。

myfile.gzデータ

私は私が何か間違ったことをやっていると思う:ここ詳細がありますGZIPを使っている間に、の詳細の違いに気付いたので私は次のコマンドを使用して取得します。file myfile.gz

+0

ただ、関心のうち、なぜあなたは、手動でHTTPを行う代わりに使用していますライブラリ/フレームワーク? – RAnders00

+0

PNGは既に圧縮されているので、GZIPにも同様にそれを大きくする可能性があります。 –

+0

'SendGZIPFile(fileName、outputStream)'を呼び出す部分も表示できますか? – RAnders00

答えて

1

Flush gzos閉じる前にdosを閉じます。または最初にgzosを閉じてください。

+0

私の問題はsendGZIPFilesの2番目の関数であり、変数gzosはありません。 –

+0

申し訳ありませんが、 'gzos.close();'が混乱しました –

+0

あなたの行終端文字は怪しいようですが、内容の配置行で\ nを削除してみてください。 –

1

基本的な正当性が欠けているコード(あなたのコードにHTTPを実装していない方がよいでしょう。よりスマートな人々はこれまでにすでにそうしています)は、正しくデータをコピーしていないという問題があります。

byte[] buf = new byte[1024]; 
int len; 
while((len = fis.read(buf)) != -1) 
{ 
    dos.write(buf, 0, len); 
} 

それとも、ただのApache CommonsのIOを使用することができます:代わりに、あなたはこのようにループ内でコピーを行うべきである

IOUtils.copy(fis, dos); 
+0

私は試しましたが、同じファイルを返します。データや破損していない.. –