请问如何在不用struts框架,只用JSP、serverlet、java的情况下实现文件的批量下载,谢谢
最近在做一个图纸管理系统,已经实现了图纸的批量上传,目前我只会将文件路径当超链接来实现文件的单个下载,但是用左键单击此链接时会出现乱码,只能用右键另存为才能下载。现在想实...
最近在做一个图纸管理系统,已经实现了图纸的批量上传,目前我只会将文件路径当超链接来实现文件的单个下载,但是用左键单击此链接时会出现乱码,只能用右键另存为才能下载。现在想实现有选择的批量下载,不要出现乱码,请帮帮我吧!
展开
2个回答
展开全部
批量下载是什么意思啊?
可以提交给一个servlet,然后把文件流写入到response中,这和用不用struts框架没有关系。
出现乱码,是下载流里的字符集没有设置,具体的记不清了,属性方法里挨个试也出来了。
看你的意思好象是,一个页面上有多个checkbox选择,点下载按钮,把选中的都下载下来,
建议多做一个压缩的功能,把选择的做成一个压缩包。只下载一次,如果连续弹出多个下载框的话,对性能的影响有些大。
可以提交给一个servlet,然后把文件流写入到response中,这和用不用struts框架没有关系。
出现乱码,是下载流里的字符集没有设置,具体的记不清了,属性方法里挨个试也出来了。
看你的意思好象是,一个页面上有多个checkbox选择,点下载按钮,把选中的都下载下来,
建议多做一个压缩的功能,把选择的做成一个压缩包。只下载一次,如果连续弹出多个下载框的话,对性能的影响有些大。
追问
你好,我确实需要有多个checkbox,然后下载选中的全部文件,请问这个如何实现呢?我非常急需这个功能,非常感谢!
追答
刚刚看到追问,
Java的API里有zip功能,
/**
* 压缩
* @param root 文件目标
* @param outpath 输出路径
*/
protected void zip(File root, String outpath) {
// 模式
String pattern = "{0}\\{1}.zip";
// 输出文件流
FileOutputStream fout = null;
// zip文件输出流
ZipOutputStream zout = null;
try {
// 文件名
String name = root.getName();
if (name.lastIndexOf(".") != -1) {
name = name.substring(0, name.lastIndexOf("."));
}
// zip输出流声明
fout = new FileOutputStream(messageFormat(pattern, outpath, name));
zout = new ZipOutputStream(fout);
// 压缩
zip(root, zout, root.getName());
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
close(zout);
close(fout);
}
}
/**
* 压缩
* @param root 文件目标
* @param zout 输出流
* @param entryName 对象名
*/
protected void zip(File root, ZipOutputStream zout, String entryName)
throws Exception {
if (root.isFile()) {// 压缩文件
FileInputStream fin = new FileInputStream(root);
byte[] buff = new byte[4096];
int len = 0;
ZipEntry entry = new ZipEntry(entryName);
zout.putNextEntry(entry);
while ((len = fin.read(buff)) != -1) {
zout.write(buff, 0, len);
}
zout.closeEntry();
fin.close();
} else if (root.isDirectory()) {// 压缩文件夹
File[] files = root.listFiles();
if (files.length == 0) {
ZipEntry entry = new ZipEntry(entryName + "/");
zout.putNextEntry(entry);
zout.closeEntry();
return;
}
for (int fileIndex = 0; fileIndex < files.length; fileIndex++) {
File tmp = files[fileIndex];
zip(tmp, zout, entryName + "/" + tmp.getName());
}
}
}
这是实现压缩的代码,生成一个zip文件,然后把这个文件下载下来。
用多个下载对话框,不推荐使用。当个数多的时候,会出现丢下载文件丢失的情况。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询