选择多个文件到一个zip并下载zip文件时出错?

时间:2012-06-16 09:25:57

标签: java

   <% // 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编程的新手,你能帮帮我吗?

1 个答案:

答案 0 :(得分: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()