2012-06-16 96 views
-2
<% // Set the content type based to zip 
    response.setContentType("Content-type:text/zip"); 
    response.setHeader("Content-Disposition", "attachment; filename=mytest.zip"); 

    // List of files to be downloaded 
    List files = new ArrayList(); 
    files.add(new File("C:/first.txt")); 
    files.add(new File("C:/second.txt")); 
    files.add(new File("C:/third.txt")); 

    ServletOutputStream out1 = response.getOutputStream(); 
    ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(out1)); 
    for (Object file : files) 
    { 
     //System.out.println("Adding file " + file.getName()); 
     System.out.println("Adding file " + file.getClass().getName()); 
     //zos.putNextEntry(new ZipEntry(file.getName())); 
     zos.putNextEntry(new ZipEntry(file.getClass().getName())); 
     // Get the file 
     FileInputStream fis = null; 
     try { 
      fis = new FileInputStream(file); 
     } catch (Exception E) { 
      // If the file does not exists, write an error entry instead of file contents 
      //zos.write(("ERROR: Could not find file " + file.getName()).getBytes()); 
      zos.write(("ERROR: Could not find file" +file.getClass().getName()).getBytes()); 
      zos.closeEntry(); 
      //System.out.println("Could not find file "+ file.getAbsolutePath()); 
      continue; 
     } 
     BufferedInputStream fif = new BufferedInputStream(fis); 
     // Write the contents of the file 
     int data = 0; 
     while ((data = fif.read()) != -1) { 
      zos.write(data); 
     } 
     fif.close(); 
     zos.closeEntry(); 
     //System.out.println("Finished adding file " + file.getName()); 
     System.out.println("Finished adding file " + file.getClass().getName()); 
    } 
    zos.close(); 
%> 

這是我的實際程序,想壓縮多個文件,然後下載它,是我正在做的方式是正確的或錯誤的,是新的JAVA編程,你能幫我嗎?將多個文件選擇到一個zip文件並下載zip文件時出錯?

+0

您還應該發佈填充'files'集合的代碼。這將有助於瞭解內部是什麼類型的對象。 – npe

回答

0

for循環應該是這樣的:

for (File file : files) { 
    ... 

for (String file : files) { 
    ... 

你聲明file變量的方式,使編譯器假定它是一個Object,而不是一個File實例。因此,您會收到編譯錯誤,因爲沒有FileInputStream構造函數接受Objectfile必須是包含文件絕對路徑的FileString

另一個錯誤就是你將文件名傳遞給ZipEntry。 使用:

file.getClass().getName() 

將導致"java.io.File""java.lang.String",而不是文件名。 要設置文件的正確名稱,請使用File#getName()