<% // 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编程的新手,你能帮帮我吗?
答案 0 :(得分:0)
您的for
循环应如下所示:
for (File file : files) {
...
或
for (String file : files) {
...
您声明file
变量的方式使编译器认为它是Object
,而不是File
实例。因此,您会收到编译错误,因为没有FileInputStream
构造函数接受Object
。 file
必须是包含文件绝对路径的File
或String
。
另一个错误就是你将文件的名称传递给ZipEntry的方式。 使用:
file.getClass().getName()
将导致"java.io.File"
或"java.lang.String"
,而不是文件名。
要设置文件的正确名称,请使用File#getName()
。