我编写了一个Java Web应用程序,允许用户从服务器下载文件。这些文件非常大,因此在下载之前将它们压缩在一起。
它的工作原理如下:
1.用户获得符合他/她的标准的文件列表
2.如果用户喜欢文件并想要下载,他/她通过选中复选框来选择它
3.然后用户点击“下载”
4.然后将文件压缩并存储在服务器上
5.然后,用户会看到一个页面,其中包含可下载zip文件的链接
6.但是,在下载zip文件时,下载的文件大小为0字节
我已经检查了远程服务器并正确创建了zip文件,剩下的就是以某种方式为用户提供文件,你能看到我可能出错的地方,或者建议更好的方式来提供服务文件。
创建链接的代码是:
<%
String zipFileURL = (String) request.getAttribute("zipFileURL"); %>
<p><a href="<% out.print(zipFileURL); %> ">Zip File Link</a></p>
创建zipFileURL变量的代码是:
public static String zipFiles(ArrayList<String> fileList, String contextRootPath) {
//time-stamping
Date date = new Date();
Timestamp timeStamp = new Timestamp(date.getTime());
Iterator fileListIterator = fileList.iterator();
String zipFileURL = "";
try {
String ZIP_LOC = contextRootPath + "WEB-INF" + SEP + "TempZipFiles" + SEP;
BufferedInputStream origin = null;
zipFileURL = ZIP_LOC
+ "FITS." + timeStamp.toString().replaceAll(":", ".").replaceAll(" ", ".") + ".zip";
FileOutputStream dest = new FileOutputStream(ZIP_LOC
+ "FITS." + timeStamp.toString().replaceAll(":", ".").replaceAll(" ", ".") + ".zip");
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
dest));
// out.setMethod(ZipOutputStream.DEFLATED);
byte data[] = new byte[BUFFER];
while(fileListIterator.hasNext()) {
String fileName = (String) fileListIterator.next();
System.out.println("Adding: " + fileName);
FileInputStream fi = new FileInputStream(fileName);
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(fileName);
out.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return zipFileURL;
}
答案 0 :(得分:1)
URL无法访问WEB-INF下的任何文件(直接)。我建议使用servlet将文件从保存到
的任何位置返回还建议将文件保存在webapp的上下文之外