2016-03-30 9 views
0

DÜZENLEME: hata, hata Bu kodda değildi. Ön uçtaki indirme hatalıydı. Sunucuda zip iyiydi ama js ile indirme işe yaramadı.ZipOutputStream ile zip dosyasına xml dosyaları yazma -

Bir zip dosyasına iki adet xml dosyası yazıyorum. Ortaya çıkan dosyayı açamıyorum (hata: dosya yok ve klasör yok).

Tuple, iki Strings (A ve B), xml içeriğim içeren bir sınıftır. Bunu ilk olarak closeEntry olmadan ve setSize olmadan denedim, sonuç aynı.

Herhangi bir fikrin var mı? Bunu nasıl ayıklayabilirim?

private static byte[] createArchive(final Tuple<String, String> body) throws IOException { 

    try (final ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     final ZipOutputStream zos = new ZipOutputStream(bos)) { 

     final ZipEntry firstEntry = new ZipEntry("first.xml"); 
     firstEntry.setSize(body.getA().getBytes().length); 
     zos.putNextEntry(firstEntry); 
     zos.write(body.getA().getBytes()); 
     zos.closeEntry(); 

     final ZipEntry secondEntry = new ZipEntry("second.xml"); 
     secondEntry.setSize(body.getB().getBytes().length); 
     zos.putNextEntry(secondEntry); 
     zos.write(body.getB().getBytes()); 
     zos.closeEntry(); 

     zos.close(); 

     return bos.toByteArray(); 
    } 
} 
+2

"OutputStream" öğenizi Dosyaya yazma kodu nerede? – user2004685

+2

Başka bir şeyden başka, kodlamayı belirtmeden 'String.getBytes()' diyorsunuz. Bunu yapma - * her zaman * kodlamayı belirtin. Ayrıca, bir defada getBytes() işlevini çağırıyorsunuz - bir kez uzunluğunu almak için, ve sonra tekrar yazmak için. Giriş başına bir kez çağırırdım, sonucu bir bayt [] 'a kaydederdim. Bu mantığı bir yöntemle yazmak isteyebilirsiniz, 'writeStringAsZipEntry' ya da benzer bir şey ... –

+0

Yazma, Apache Camel tarafından yapılır. Bu diğer dosyalarla çalışır, bu yüzden buraya dahil değildir. GetBytes çağrısı hala iki kez kullanılır çünkü ilk önce boyutunu belirtmedim. Bu gerekli mi? –

cevap

0

Hata bu yöntemde değil inanıyorum. Gönderi kodunuza dayanan şu snippet geçerli bir ZIP arşivi oluşturur.

try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ZipOutputStream zos = new ZipOutputStream(bos)) { 

    byte[] fileA = Files.readAllBytes(Paths.get("/tmp/fileA.xml")); 
    byte[] fileB = Files.readAllBytes(Paths.get("/tmp/fileB.xml")); 
    ZipEntry firstEntry = new ZipEntry("first.xml"); 
    firstEntry.setSize(fileA.length); 
    zos.putNextEntry(firstEntry); 
    zos.write(fileA); 
    zos.closeEntry(); 

    ZipEntry secondEntry = new ZipEntry("second.xml"); 
    secondEntry.setSize(fileB.length); 
    zos.putNextEntry(secondEntry); 
    zos.write(fileB); 
    zos.closeEntry(); 
    zos.close(); 

    Files.write(Paths.get("/tmp/files.zip"), bos.toByteArray()); 
} 

onay arşiv Jon Skeet gibi

jar vtf /tmp/files.zip 
    5 Wed Mar 30 13:15:02 CEST 2016 first.xml 
    5 Wed Mar 30 13:15:02 CEST 2016 second.xml 

büyük olasılıkla body.getA() alakalı belirtti. Bu yöntem bir String döndürürse, dosya içeriğinin bozuk olmadığından emin olmak için kodlamayı belirtmeniz gerekir.