//实现压缩文件功能,采用 ,插件
final outputstream out = new fileoutputstream("d:/edi/edi.zip"); //实例文件输出流
archiveoutputstream os = new archivestreamfactory().createarchiveoutputstream(archivestreamfactory.zip, out);
//实例化存档输出流,工厂方法创建zip的存档输出流
// file f1 = new file(file.getpath());
os.putarchiveentry(new ziparchiveentry(file.getname())); //生成存档文件名
ioutils.copy(new fileinputstream(file), os); //添加拷贝存档文件
os.closearchiveentry();
os.close();
//*************************
try {
file input = new file("d:/edi/edi.zip");//获得下载文件路径
contenttype="application/octet-stream";
docstream = new fileinputstream(input);//获得输入流名称
contentdisposition =urlencoder.encode(input.getname() ,"utf-8");
} catch (filenotfoundexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
return "download";
webwork的文件下载机制。使用起来还是比较简单的。下面是用法说明:
首先在一个action中,如果判断有权限进行文件下载。
则:
1、读出该下载文件,并生成一个流。 文件名应当从请求的request中读出,或从用户的表中取出。
public string downloadfile(string filename){
try {
file input = new file("e:/engilish literature.doc");
docstream = new fileinputstream(input);
contentdisposition = "test.txt";
} catch (filenotfoundexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
return "download";
}
2、将输出导向到一个特殊的result中去。叫做steam result。
/home/register-result.jsp
/home/register.jsp
application/x-msdownload
docstream
1024
attachment;filename="${contentdisposition}"
3、这中间有几个参数需要配置:
contenttype设成 application/x-msdownload 就可以。这样浏览器会保证弹出一个下载文件的对话框。
inputname 这个比较重要,这个名字是输入流的名称, 以后要steam result的实现类中为根据ognl的表达式去查找的。
contentdisposition 这个是下载之后,保存在用户端的文件名称。${contentdisposition} 看一下代码。如果写成上述的方式,就有机会在action中设置文件名。
4、另外一个参数:contentlength就是下载文件的大小,webwork的stream result似乎实现有问题,不能根据文件的大小动态进行设置,只能写死。
这个参数的意义是告诉浏览下载的文件有多大,以便浏览器正确的显示进度条。如果这个功能很重要的话,可以重新写一个result来实现。