2011-01-13 29 views
5

Mục tiêu của tôi là đặt nhiều đối tượng java.io.File vào tệp zip và in tới HttpServletResponse để người dùng tải xuống.Cách tạo tệp ZIP cho danh sách "tệp ảo" và xuất ra httpservletresponse

Các tệp được tạo bởi trình sửa lỗi JAXB. Đó là một đối tượng java.io.File, nhưng nó không thực sự trên hệ thống tệp (nó chỉ trong bộ nhớ), vì vậy tôi không thể tạo một FileInputStream.

Tất cả tài nguyên tôi đã thấy sử dụng OutputStream để in nội dung tệp zip. Nhưng, tất cả các tài nguyên đó đều sử dụng FileInputStream (mà tôi không thể sử dụng).

Bất kỳ ai biết cách tôi có thể thực hiện việc này?

+3

Ý anh là gì đó là một 'java.io.File'? Đối tượng 'File' chỉ là một đối tượng địa chỉ ưa thích; nó không mang bất kỳ nội dung tập tin nào. Dữ liệu của bạn ở đâu? – erickson

Trả lời

3

Hóa ra tôi là một thằng ngốc :) Các tập tin đó đã được "tạo ra" là tiết kiệm cho con đường không hợp lệ và nuốt ngoại lệ, vì vậy tôi nghĩ rằng nó đã được "tạo ra" ok. Tuy nhiên, khi tôi cố gắng tạo một FileInputStream mới, nó đã phàn nàn rằng tệp đó không tồn tại (đúng như vậy). Tôi đã có một brainfart và giả định rằng đối tượng java.io.File thực sự chứa thông tin tệp ở đâu đó. Nhưng như erickson đã chỉ ra, đó là sai.

Cảm ơn Ralph cho mã, tôi đã sử dụng nó sau khi tôi giải quyết vấn đề đường dẫn không hợp lệ.

Mã của tôi:

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

Vấn đề đường dẫn bên cạnh? - ý bạn là gì - có lỗi nào trong mã của câu trả lời của tôi không? – Ralph

+0

Không có mã của bạn là hoàn hảo. Là lỗi của tôi. – Corey

6

Hãy xem qua thư viện Apache Commons Compress, nó đã chứng minh chức năng bạn cần.

Tất nhiên "erickson" là đúng whit cam kết của mình đối với câu hỏi của bạn. Bạn sẽ cần tệp conentet chứ không phải đối tượng java.io.File. Trong ví dụ của tôi, tôi giả định rằng bạn có một phương thức byte[] getTheContentFormSomewhere(int fileNummer) trả về nội dung tệp (trong bộ nhớ) cho tệpNội dung thứ hai. - Tất nhiên chức năng này là thiết kế kém, nhưng nó chỉ dành cho ilustration.

Nó sẽ làm việc một chút như thế này:

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 của bộ điều khiển http của bạn:

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(); 
Các vấn đề liên quan