2016-03-24 13 views
0

GZIP görüntüsüne GZIPOutputStream sınıfını kullanıyorum. GZIP dosyasını OutputStream üzerinden göndermeye çalışırken bozuk bir dosya alıyorum. FileOutputStream'e GZIP'yi nasıl yapacağımı biliyorum. Aşağıdaki kod mükemmel çalışıyor:Java'da GZIP dosyaları nasıl yapılır ve OutputStream aracılığıyla gönderirsiniz

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(); 
} 

çıktı dosyası myfile.png.gz ve şu ayrıntıları sahiptir:

myfile.png.gz: FAT dosya sistemi gzip sıkıştırılmış veriler, (bir dosyayı gzip ve OutputStream'e göndermek çalıştığınızda MS-DOS, OS/2, NT)

Benim sorundur. Bir sunucuyla çalıştığım için bunu sunucumdan arıyorum ve yuvaları kullanıyorum.

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(); 
} 

Ne olsun hiçbir şey içeren bir bozuk GZIP dosyasıdır:

myfile.gz veri

ben yanlış bir şey yapıyorum düşünüyorum: Burada ayrıntıları vardır GZipping yaparken arasındaki ayrıntılarını fark ettim. Bunu almak için aşağıdaki komutu kullanın:

+0

Meraktan soruyorum, neden el HTTP yapıyor yerine kullanıyor kütüphane/framework? – RAnders00

+0

PNG zaten sıkıştırılmıştır, bu yüzden GZIP'yi denemeye çalışmanız da daha büyük hale getirecektir. –

+0

Ayrıca "SendGZIPFile (fileName, outputStream)" diyen kısmı da gösterebilir misiniz? – RAnders00

cevap

1

dos'u kapatmadan önce gzos Flush'i yıkayın. Ya da önce 'u kapatın.

+0

lütfen sorunumun, sendGZIPFiles işlevinin ikinci işleviyle olduğunu ve değişken bir gzos'unun olmadığını farkedin. –

+0

Üzgünüz, 'gzos.close();' beni karıştırdı –

+0

Hat sonlandırıcıları balık gibi görünüyor, içerik kullanma satırında \ n öğesini kaldırmayı deneyin. –

1

Kodunuzun yanı sıra temel doğruluktan yoksun (muhtemelen kodunuzda HTTP'yi uygulamamanız gerekir, daha akıllı kullanıcılar geçmişte zaten yapmış olabilir), sorunun doğru bir şekilde veri kopyalamaması olduğunu düşünüyorum.

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

Ya da sadece Apache Commons IO kullanabilirsiniz: Bunun yerine, böyle bir döngü içinde kopyalama yapıyor olmalı

IOUtils.copy(fis, dos); 
+0

Denedim, ancak aynı dosyayı döndürüyor. veri olmadan ve bozuk .. –

İlgili konular