Struts 2 下载文件(12)
2008-04-23 20:17
381 查看
11.3 Struts 2控制文件下载
文件下载相对于文件上传要简单得多,最简单的方式就是直接在页面上给出一个下载文件的链接,使用Struts 2框架来控制文件的下载,关键是需要配置一个stream类型的结果,需要指定下面4个属性。
contentType属性:指定被下载文件的文件类型。
inputName属性:指定被下载文件的入口输入流。
contentDisposition属性:指定下文件的文件名称。
bufferSize属性:指定下载文件时的缓冲区大小。
配置上面4个属性,既可以在配置文件中配置,也可以在Action中设置该属性来完成配置。
代码11.9 文件下载业务控制器
package ch11;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
public class FileDownloadAction implements Action ...{
private String inputPath;
public void setInputPath(String value) ...{
inputPath = value;
}
//返回一个InputStream类型值
public InputStream getInputStream() throws Exception ...{
return ServletActionContext.getServletContext().getResourceAsStream (inputPath);
}
public String execute() throws Exception ...{
return SUCCESS;
}
}
该Action非常简单,并没有其他特殊之处,关键在于配置文件中关于该Action的配置,其内容如下所示:
<!--配置文件定义文件下载-->
<action name="download" class="ch11.FileDownloadAction">
<!--指定下载资源位置-->
<param name="inputPath">/upload/struts-power.gif</param>
<!--指定success逻辑视图为一个stream类型,即流视图-->
<result name="success" type="stream">
<!--下载文件的类型-->
<param name="contentType">image/gif</param>
<!--下载文件位置-->
<param name="inputName">inputStream</param>
<param name="contentDisposition">
filename="struts.gif"
</param>
<!--缓冲区大小-->
<param name="bufferSize">4096</param>
</result>
</action>
读者可以看到,该Action指定了一个success返回逻辑视图,该视图类型为stream,即一个流类型,即需要下载的资源流。本示例中,在该success逻辑视图中增加了4个参数,参数contentType指定了下载资源的类型;inputName参数和contentDisposition参数指定了下载资源的位置;bufferSize参数指定了下载资源的缓冲区大小。
在Action配置中,初始化了一个inputPath参数,即指定了下载资源的Web相对位置。读者可以运行该示例,在浏览器中输入http://localhost:8080/bookcode/ch11/download.action,结果如图11.11所示。
图11.11 Struts 2控制文件下载界面
代码11.10 动态指定下载资源的业务控制器
package ch11;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
public class Filedownload extends ActionSupport ...{
private String inputPath;
private String contentType;
private String filename;
//返回一个InputStream类型值
public InputStream getInputStream() throws Exception ...{
return ServletActionContext.getServletContext().getResourceAsStream(
inputPath);
}
//execute方法
public String execute() throws Exception ...{
//调用相关业务逻辑方法,动态设置相关下载信息
inputPath = "/upload/struts-power.gif";
filename = "test.gif";
contentType = "image/gif";
return SUCCESS;
}
public String getContentType() ...{
return contentType;
}
public void setContentType(String contentType) ...{
this.contentType = contentType;
}
public String getFilename() ...{
return filename;
}
public void setFilename(String filename) ...{
this.filename = filename;
}
}
读者可以看到,该Action可以根据用户的不同请求,动态指定不同的下载资源信息,下面的代码是对应的配置文件内容:
<action name="filedownload" class="ch11.Filedownload">
<result name="success" type="stream">
<!-- 定义相关参数值-->
<param name="contentType">${contentType}</param>
<param name="inputName">inputStream</param>
<param name="bufferSize">4096</param>
<param name="contentDisposition">
filename="${filename}"
</param>
</result>
</action>
读者可以同前面的示例相比较,在浏览器中输入http://localhost:8080/bookcode/ch11/ filedownload.action,返回界面如图11.11所示,同前面示例的结果完全一致。
(1)增加了权限控制的Action如代码11.11所示。
代码11.11 增加权限检查的业务控制器
package ch11;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
public class FileDownloadAction implements Action ...{
private String username;
private String password;
private String inputPath;
public void setInputPath(String value) ...{
inputPath = value;
}
public InputStream getInputStream() throws Exception ...{
return ServletActionContext.getServletContext().getResourceAsStream (inputPath);
}
public String execute() throws Exception ...{
//权限检查
if(username.equals("pla")&&password.equals("mypassword"))...{
return SUCCESS;
}else...{
return INPUT;
}
}
//属性的getter和setter方法
public String getUsername() ...{
return username;
}
public void setUsername(String username) ...{
this.username = username;
}
public String getPassword() ...{
return password;
}
public void setPassword(String password) ...{
this.password = password;
}
}
(2)同时修改配置文件,增加一个input逻辑视图,修改后的配置文件内容如下所示:
<!--配置文件定义文件下载-->
<action name="download" class="ch11.FileDownloadAction">
<!--指定下载资源位置-->
<param name="inputPath">/upload/struts-power.gif</param>
<!--指定success逻辑视图为一个stream类型,即流视图-->
<result name="success" type="stream">
<!--下载文件的类型-->
<param name="contentType">image/gif</param>
<!--下载文件位置-->
<param name="inputName">inputStream</param>
<param name="contentDisposition">
filename="struts.gif"
</param>
<!--缓冲区大小-->
<param name="bufferSize">4096</param>
</result>
<result name="input">/ch11/login.jsp</result>
</action>
(3)重新运行该示例,在浏览器中输入http://localhost:8080/bookcode/ch11/download. action,返回界面如图11.12所示。
(4)由于加入了文件下载权限控制功能,用户直接下载文件就会转到用户登录界面,在该界面中用户可以输入“pla”和“mypassword”,单击“登录”按钮,返回界面如图11.11所示,即通过了权限验证,可以正常下载文件。
图11.12 控制文件下载登录界面
使用Struts 2框架的文件下载,会给开发者带来很多便利:
可以文件下载的用户权限进行验证;
支持中文文件名称的下载(例如:…/图片.gif);
加强了文件下载的安全性,使用Struts 2的文件现在,在如图11.11所示的界面中,右键单击图片文件,单击“属性”菜单,会发现显示的不是常规的图片地址,而是指向了action,这样防止了用户获得服务器相关路径的信息,如图11.13所示。
图11.13 使用Struts 2文件下载的图片地址
文件下载相对于文件上传要简单得多,最简单的方式就是直接在页面上给出一个下载文件的链接,使用Struts 2框架来控制文件的下载,关键是需要配置一个stream类型的结果,需要指定下面4个属性。
contentType属性:指定被下载文件的文件类型。
inputName属性:指定被下载文件的入口输入流。
contentDisposition属性:指定下文件的文件名称。
bufferSize属性:指定下载文件时的缓冲区大小。
配置上面4个属性,既可以在配置文件中配置,也可以在Action中设置该属性来完成配置。
11.3.1 在配置文件中指定下载资源
下面给出在配置文件中指定下载资源的示例,如代码11.9所示。代码11.9 文件下载业务控制器
package ch11;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
public class FileDownloadAction implements Action ...{
private String inputPath;
public void setInputPath(String value) ...{
inputPath = value;
}
//返回一个InputStream类型值
public InputStream getInputStream() throws Exception ...{
return ServletActionContext.getServletContext().getResourceAsStream (inputPath);
}
public String execute() throws Exception ...{
return SUCCESS;
}
}
该Action非常简单,并没有其他特殊之处,关键在于配置文件中关于该Action的配置,其内容如下所示:
<!--配置文件定义文件下载-->
<action name="download" class="ch11.FileDownloadAction">
<!--指定下载资源位置-->
<param name="inputPath">/upload/struts-power.gif</param>
<!--指定success逻辑视图为一个stream类型,即流视图-->
<result name="success" type="stream">
<!--下载文件的类型-->
<param name="contentType">image/gif</param>
<!--下载文件位置-->
<param name="inputName">inputStream</param>
<param name="contentDisposition">
filename="struts.gif"
</param>
<!--缓冲区大小-->
<param name="bufferSize">4096</param>
</result>
</action>
读者可以看到,该Action指定了一个success返回逻辑视图,该视图类型为stream,即一个流类型,即需要下载的资源流。本示例中,在该success逻辑视图中增加了4个参数,参数contentType指定了下载资源的类型;inputName参数和contentDisposition参数指定了下载资源的位置;bufferSize参数指定了下载资源的缓冲区大小。
在Action配置中,初始化了一个inputPath参数,即指定了下载资源的Web相对位置。读者可以运行该示例,在浏览器中输入http://localhost:8080/bookcode/ch11/download.action,结果如图11.11所示。
图11.11 Struts 2控制文件下载界面
11.3.2 在Action中指定下载资源
前面的示例在配置文件中指定了下载资源的相关信息,但是这样指定资源是静态的,一般的应用要求系统根据用户不同的需要来动态下载资源。Struts 2框架还允许在Action中动态设置相关的资源下载配置信息,如代码11.10所示。代码11.10 动态指定下载资源的业务控制器
package ch11;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
public class Filedownload extends ActionSupport ...{
private String inputPath;
private String contentType;
private String filename;
//返回一个InputStream类型值
public InputStream getInputStream() throws Exception ...{
return ServletActionContext.getServletContext().getResourceAsStream(
inputPath);
}
//execute方法
public String execute() throws Exception ...{
//调用相关业务逻辑方法,动态设置相关下载信息
inputPath = "/upload/struts-power.gif";
filename = "test.gif";
contentType = "image/gif";
return SUCCESS;
}
public String getContentType() ...{
return contentType;
}
public void setContentType(String contentType) ...{
this.contentType = contentType;
}
public String getFilename() ...{
return filename;
}
public void setFilename(String filename) ...{
this.filename = filename;
}
}
读者可以看到,该Action可以根据用户的不同请求,动态指定不同的下载资源信息,下面的代码是对应的配置文件内容:
<action name="filedownload" class="ch11.Filedownload">
<result name="success" type="stream">
<!-- 定义相关参数值-->
<param name="contentType">${contentType}</param>
<param name="inputName">inputStream</param>
<param name="bufferSize">4096</param>
<param name="contentDisposition">
filename="${filename}"
</param>
</result>
</action>
读者可以同前面的示例相比较,在浏览器中输入http://localhost:8080/bookcode/ch11/ filedownload.action,返回界面如图11.11所示,同前面示例的结果完全一致。
11.3.3 文件下载的权限控制
读者明白了Struts 2框架文件下载的原理后,就很容易实现文件下载的权限控制,可以在Action的execute方法中加入用户合法身份的验证,如果不合法,则返回一个input逻辑视图,即返回给用户一个登录界面;如果是一个合法用户,则可以返回success逻辑视图,即返回用户想要下载的资源。(1)增加了权限控制的Action如代码11.11所示。
代码11.11 增加权限检查的业务控制器
package ch11;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
public class FileDownloadAction implements Action ...{
private String username;
private String password;
private String inputPath;
public void setInputPath(String value) ...{
inputPath = value;
}
public InputStream getInputStream() throws Exception ...{
return ServletActionContext.getServletContext().getResourceAsStream (inputPath);
}
public String execute() throws Exception ...{
//权限检查
if(username.equals("pla")&&password.equals("mypassword"))...{
return SUCCESS;
}else...{
return INPUT;
}
}
//属性的getter和setter方法
public String getUsername() ...{
return username;
}
public void setUsername(String username) ...{
this.username = username;
}
public String getPassword() ...{
return password;
}
public void setPassword(String password) ...{
this.password = password;
}
}
(2)同时修改配置文件,增加一个input逻辑视图,修改后的配置文件内容如下所示:
<!--配置文件定义文件下载-->
<action name="download" class="ch11.FileDownloadAction">
<!--指定下载资源位置-->
<param name="inputPath">/upload/struts-power.gif</param>
<!--指定success逻辑视图为一个stream类型,即流视图-->
<result name="success" type="stream">
<!--下载文件的类型-->
<param name="contentType">image/gif</param>
<!--下载文件位置-->
<param name="inputName">inputStream</param>
<param name="contentDisposition">
filename="struts.gif"
</param>
<!--缓冲区大小-->
<param name="bufferSize">4096</param>
</result>
<result name="input">/ch11/login.jsp</result>
</action>
(3)重新运行该示例,在浏览器中输入http://localhost:8080/bookcode/ch11/download. action,返回界面如图11.12所示。
(4)由于加入了文件下载权限控制功能,用户直接下载文件就会转到用户登录界面,在该界面中用户可以输入“pla”和“mypassword”,单击“登录”按钮,返回界面如图11.11所示,即通过了权限验证,可以正常下载文件。
图11.12 控制文件下载登录界面
使用Struts 2框架的文件下载,会给开发者带来很多便利:
可以文件下载的用户权限进行验证;
支持中文文件名称的下载(例如:…/图片.gif);
加强了文件下载的安全性,使用Struts 2的文件现在,在如图11.11所示的界面中,右键单击图片文件,单击“属性”菜单,会发现显示的不是常规的图片地址,而是指向了action,这样防止了用户获得服务器相关路径的信息,如图11.13所示。
图11.13 使用Struts 2文件下载的图片地址
相关文章推荐
- Struts 2读书笔记-----使用Struts 2控制文件下载
- struts 实现文件上传与下载
- 文件上传和下载12-15讲
- struts1文件下载
- Android文件下载——12
- Struts2.0 文件上传与下载全解析
- java框架Struts学习--文件上传与下载
- struts web页面 下载文件 转载的
- Struts学习笔记: 实现文件上传下载
- 【Struts2文件下载】struts.xml文件中配置action,访问路径问题
- struts下载文件完成后跳转页面
- struts文件的上传与下载
- Struts文件下载
- Struts 2中实现文件下载(修正中文问题)
- Struts文件上传下载
- JavaWeb -- Struts1 多文件上传与下载 DownloadAction, DispatchAction
- Struts 2文件的上传与下载
- struts1文件上传和下载
- Struts实时生成Excel文件下载
- struts2单文件和多文件的上传和下载