文件下载最简单的方法就是直接在页面上给出一个超链接,该链接的href属性为服务器上文件的路径。
如果需要对用户下载之前进行进一步的检查,比如判断用户是否有足够的权限来下载该文件等,普通下载是无能为力了。
但如果该文件的文件名为中文,则会导致悲剧的404! 而Struts下载就可以轻松实现!
一下午就在实验室看《Struts2.1权威指南》,这本书看似很厚,但内容真的不行,很多地方都没说清楚(一张Struts上传下载文件,90%讲的是用Struts上传。。。-.-),本来一个很简单的Struts2下载文件,浪费了一个下午,最后还有一个奇怪的问题怎么也解决不了,是关于上传路径的,网上也找不到相关资料,感觉应该是IDE的问题,不过对项目及Struts2下载文件不产生任何影响。
在struts.xml中
有4个重要的属性
contentType:指定被下载文件的文件类型
inputName:指定被下载文件的入口输入流
contentDisposition:制定被下载文件的文件名
bufferSize:缓冲大小
代码样例如下:
<action name=“download” class=“downloadFileAction”>
<result name=“success” type=“stream”>
<param name=“contentType”>
application/octet-stream
</param>
<param name=“inputName”>inputStream</param>
<param name=“contentDisposition”>
attachment;filename=”${downloadName}”
</param>
<param name=“bufferSize”>4096</param>
</result>
</action>
</package>
下面来看实现下载的Action代码:
private ResourceService resourceService;
private int id;
private String fileName;
private String downloadName;
//省略Getter和Setter方法
//两个重要方法
public String execute() throws Exception {
String[] info=new String[2];
info=resourceService.download(id);
downloadName=info[1];
fileName=info[0];
return SUCCESS;
}
public InputStream getInputStream() {
InputStream in = ServletActionContext.getServletContext().getResourceAsStream(fileName);
System.out.println(in);
return in;
}
}
downloadName和配置文件中的${downloadName}对应,是下载文件名,即弹出对话框中的显示的文件名;
fileName是服务器保存指定文件的绝对路径,在Action中形成InputStream。
我是根据前台(jsp页面)传来的id,在service层调用dao层从数据库中得到本地文件的地址及文件名,不知道实际开发是不是应该这样做,那破书只字不提,网上教程也都是事先指定好下载文件名,但这样对实际开发没有意义。
用Struts2实现下载文件就是这样,还是比较清晰的,权限问题可以用Struts拦截器轻松实现。
“我是根据前台(jsp页面)传来的id,在service层调用dao层从数据库中得到本地文件的地址及文件名,不知道实际开发是不是应该这样做”
偶就是这么做的,可以看我写的DownloadAction,比较讨厌的是这里有个乱码问题,需要转码。
sigh,我去看看你的~~
上次碰到了乱码,没理它,本来还想给FFJ检查作业的时候用英文文件的。。。