设置一个超链接,就可以下载一个文件了,但是通过超链接下载文件,暴露了下载文件的真实地址,不利于对资源进行安全保护;而且利用超链接下载文件,服务器端的文件只能存放在Web应用程序所在的目录下。
利用程序编码实现下载,可以增加安全访问控制,对经过授权认证的用户提供下载,还可以任意提供下载的数据,我们可以将文件放到Web应用程序以外的目录中,也可以将文件保存到数据库中。
步骤大概分三步:
第一步:dowm.jsp页面
第二步:DownAction.java编写
第三步:配置struts.xml文件
1. Down.jsp
<ahref="down?fileName=1.txt">1.txt下载</a>
Down为Action的名字,fileName为文件名,必须和DownAction中的fileName取名一直
2. DownAction.java
public class DownAction extendsActionSupport //继承ActionSupport可以进行异常处理
{
private String fileName; //filename和.jsp页面的fileName名字一直
private String path; //文件的下载目录
private InputStream tagFile; //目标文件流
public String getFileName()
{
return fileName;
}
public void setFileName(String fileName)
{
this.fileName = fileName;
}
public String getPath()
{
return path;
}
public void setPath(String path)
{
this.path = path;
}
//重写getTagFile方法获取返回文件流
public InputStream getTagFile() throws Exception
{
String p=ServletActionContext.getServletContext().getRealPath(getPath()); //使用相对路径是获取文件路径
System.out.println(p+fileName);
File file=new File(p+"\\"+fileName);
InputStream stream=new FileInputStream(file);
//returnServletActionContext.getServletContext().getResourceAsStream(p + fileName);
returnstream; //返回文件流结果
}
public void setTagFile(InputStream tagFile)
{
this.tagFile = tagFile;
}
}
3. struts.xml文件配置
<!--文件下载的demo-->
<action name="down" class="action.DownAction">
<param name="path">/download</param> <!-- 依赖注入下载路径-->
path名字必须和DownAction的path名字一致
<result name="success" type="stream"> <!—以流的形式返回-->
<param name="contentType">application/octet-stream;charset=utf-8</param>
<!--有输出中文的时使用<param name="contentType">application/octet-stream;charset=utf-8</param>-->
<!--<paramname="contentType">application/x-msdownload</param>--> //如果没有中文的话可以直接使用这个
<param name="inputName">tagFile</param> <!-- inputName默认值为inputStream--> tagFile名字必须和DownAction的名字一致
<param name="contentDisposition">attachment;filename=${fileName}</param>
${fileName}名字和DownAction中的fileName名一致
<param name="bufferSize">2048</param>
</result>
</action>

被折叠的 条评论
为什么被折叠?



