2011-01-13 5 views
5

Amacım, birden fazla java.io.File nesnesini bir zip dosyasına koymak ve kullanıcının indirmesi için HttpServletResponse'ye yazdırmaktır."Sanal dosyalar" ın listesi için ZIP dosyası nasıl oluşturulur ve çıktı httpservletresponse

Dosyalar JAXB marshaller tarafından oluşturuldu. Bu bir java.io.File nesnesi, ancak aslında dosya sisteminde değil (sadece bellekte), bu yüzden bir FileInputStream oluşturamıyorum.

Zip dosya içeriğini yazdırmak için, gördüğüm tüm kaynaklar OutputStream'i kullanıyor. Ancak, tüm bu kaynaklar FileInputStream'i (kullanamayacağım) kullanır.

Bunu nasıl başarabileceğimi bilen var mı?

+3

bunu bir 'java.io.File' ne demek? Bir 'File' nesnesi sadece süslü bir adres nesnesidir; herhangi bir dosya içeriği taşımamaktadır. Verileriniz nerede? – erickson

cevap

3

ben "oluşturulmuş" ediliyordu dosyanın :) bir aptalım çıkıyor oldu Geçersiz yoldan tasarruf etmek ve istisnayı yutmak için "yaratılmış" olmanın iyi olduğunu düşündüm. Ancak, yeni bir FileInputStream örneğini başlatmaya çalıştığımda, dosyanın mevcut olmadığı (haklı olarak) olduğundan şikayetçi oldu. Bir beyin fırtınası yaptım ve java.io.File nesnesinin aslında bir yerde dosya bilgisi içerdiğini farz ettim. Fakat erickson'un işaret ettiği gibi, bu yanlıştı.

Kod için teşekkürler Ralph, geçersiz yol sorunu çözdükten sonra kullandım.

Kodum:

ZipOutputStream out = new ZipOutputStream(response.getOutputStream()); 
byte[] buf = new byte[1024]; 

File file; 
InputStream in; 
// Loop through entities 
for (TitleProductAccountApproval tpAccountApproval : tpAccountApprovals) { 
    // Generate the file  
    file = xmlManager.getXML(
     tpAccountApproval.getTitleProduct().getTitleProductId(), 
     tpAccountApproval.getAccount().getAccountId(), 
     username); 

    // Write to zip file 
    in = new FileInputStream(file); 
    out.putNextEntry(new ZipEntry(file.getName())); 

    int len; 
    while ((len = in.read(buf)) > 0) { 
     out.write(buf, 0, len); 
    } 

    out.closeEntry(); 
    in.close(); 
} 

out.close(); 
+0

Geçersiz yol sorunu mu? - ne demek istiyorsun - cevabımın kodunda bir serios hatası var mı? – Ralph

+0

Hiçbir kodunuz mükemmel değildi. Benim hatamdı. – Corey

6

Apache Commons Compress libary'ye bir göz atın, ihtiyacınız olan işlevselliği sağladı.

Tabii ki "erickson", sorunuzun haklı övgüdür. java.io.File nesnesine değil, dosya conentetine ihtiyacınız olacak. Örneğimde, dosyaYönetici dosyası için dosya içeriğini (bellekte) döndüren bir yöntem byte[] getTheContentFormSomewhere(int fileNummer) olduğunu varsayalım. - Tabii ki bu fonksiyon zayıf bir tasarımdır, ancak sadece ilustrasyon içindir.

Bir böyle bit çalışması gerekir: En http kumandanın

void compress(final OutputStream out) { 
    ZipOutputStream zipOutputStream = new ZipOutputStream(out); 
    zipOutputStream.setLevel(ZipOutputStream.STORED); 

    for(int i = 0; i < 10; i++) { 
    //of course you need the file content of the i-th file 
    byte[] oneFileContent = getTheContentFormSomewhere(i); 
    addOneFileToZipArchive(zipOutputStream, "file"+i+"."txt", oneFileContent); 
    } 

    zipOutputStream.close(); 
} 

void addOneFileToZipArchive(final ZipOutputStream zipStream, 
      String fileName, 
      byte[] content) { 
    ZipArchiveEntry zipEntry = new ZipArchiveEntry(fileName); 
    zipStream.putNextEntry(zipEntry); 
    zipStream.write(pdfBytes); 
    zipStream.closeEntry(); 
} 

Snipets:

HttpServletResponse response 
... 
    response.setContentType("application/zip"); 
    response.addHeader("Content-Disposition", "attachment; filename=\"compress.zip\""); 
    response.addHeader("Content-Transfer-Encoding", "binary"); 
    ByteArrayOutputStream outputBuffer = new ByteArrayOutputStream(); 
    compress(outputBuffer); 
    response.getOutputStream().write(outputBuffer.toByteArray()); 
    response.getOutputStream().flush(); 
    outputBuffer.close(); 
İlgili konular