Struts 2 实现文件下载功能
2010-03-21 17:09
393 查看
用struts 2 实现文件下载功能,主要是3个部分代码的编写:
Action:
代码
package a.b.c;
import java.io.InputStream;
import java.io.FileInputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadAction extends ActionSupport {
private static final long serialVersionUID = 1656950476675155655L;
private String md5;
private String filename;
private String directory;
@Override
public String execute() throws Exception {
//这里进行参数验证,保证请求的下载文件合法性
// 本例对传入参数md5进行验证并将其值赋予filename
if (md5.matches("[\\w&&[^_]]{32}?")) {
filename = md5.toLowerCase();
return SUCCESS;
}
return INPUT;
}
public InputStream getInputStream() throws Exception {
String dir = directory + filename + ".txt";
return new FileInputStream(dir); //如果dir是绝对路径
// return ServletActionContext.getServletContext().getResourceAsStream(dir); //如果dir是Resource下的相对路径
}
/**
* @return the md5
*/
public String getMd5() {
return md5;
}
/**
* @param md5
* the md5 to set
*/
public void setMd5(String md5) {
this.md5 = md5;
}
/**
* @return the filename
*/
public String getFilename() {
return filename;
}
/**
* @param filename
* the filename to set
*/
public void setFilename(String filename) {
this.filename = this.getMd5();
}
/**
* @param directory
* the directory to set
*/
public void setDirectory(String directory) {
this.directory = directory;
}
}
Action中没有给出directory的get方法,其目的为保护文件路径不被访问到。
execute()方法对传入参数进行验证,若验证成功,返回success,否则返回input。
getInputStream()方法将返回一个InputStream,在struts.xml中,配置了一个参数inputStream,通过这个方法获得流对象。
struts.xml:
代码
<action name="download" class="a.b.c.DownloadAction" >
<param name="directory">D:/download/</param>
<result name="success" type="stream">
<!-- 指定下载文件的内容类型,text/plain是默认类型 -->
<param name="contentType">text/plain</param>
<!-- inputName默认值是inputStream,如果action中用于读取下载文件内容的属性名是inputStream,那么可以省略这个参数 -->
<param name="inputName">inputStream</param>
<!--动态获取文件名,从Action中的取得filename-->
<param name="contentDisposition">
attachment;filename="${filename}"
</param>
<param name="bufferSize">2048</param>
</result>
<result name="input">/WEB-INF/pages/inputError.jsp</result>
</action>
参考API SteamResult(http://struts.apache.org/2.0.14/struts2-core/apidocs/org/apache/struts2/dispatcher/StreamResult.html),其中
contentType是内容类型,根据不同文件类型参照MIME标准设置,本例是文本。
contentDisposition是文件下载的处理方式,包括内联(inline)和附件(attachment),默认是inline, 使用附件时这样配置:attachment;filename="文件名" 。
若Action中验证失败,转到inputError页面。
1. Web前端传入文件名参数;
2. 编写寻找文件并返回InputStream的Action;
3. 在struts.xml中进行配置。
本文将给出一个对上述二、三部分代码编写的一个例子。2. 编写寻找文件并返回InputStream的Action;
3. 在struts.xml中进行配置。
Action:
代码
package a.b.c;
import java.io.InputStream;
import java.io.FileInputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadAction extends ActionSupport {
private static final long serialVersionUID = 1656950476675155655L;
private String md5;
private String filename;
private String directory;
@Override
public String execute() throws Exception {
//这里进行参数验证,保证请求的下载文件合法性
// 本例对传入参数md5进行验证并将其值赋予filename
if (md5.matches("[\\w&&[^_]]{32}?")) {
filename = md5.toLowerCase();
return SUCCESS;
}
return INPUT;
}
public InputStream getInputStream() throws Exception {
String dir = directory + filename + ".txt";
return new FileInputStream(dir); //如果dir是绝对路径
// return ServletActionContext.getServletContext().getResourceAsStream(dir); //如果dir是Resource下的相对路径
}
/**
* @return the md5
*/
public String getMd5() {
return md5;
}
/**
* @param md5
* the md5 to set
*/
public void setMd5(String md5) {
this.md5 = md5;
}
/**
* @return the filename
*/
public String getFilename() {
return filename;
}
/**
* @param filename
* the filename to set
*/
public void setFilename(String filename) {
this.filename = this.getMd5();
}
/**
* @param directory
* the directory to set
*/
public void setDirectory(String directory) {
this.directory = directory;
}
}
Action中没有给出directory的get方法,其目的为保护文件路径不被访问到。
execute()方法对传入参数进行验证,若验证成功,返回success,否则返回input。
getInputStream()方法将返回一个InputStream,在struts.xml中,配置了一个参数inputStream,通过这个方法获得流对象。
struts.xml:
代码
<action name="download" class="a.b.c.DownloadAction" >
<param name="directory">D:/download/</param>
<result name="success" type="stream">
<!-- 指定下载文件的内容类型,text/plain是默认类型 -->
<param name="contentType">text/plain</param>
<!-- inputName默认值是inputStream,如果action中用于读取下载文件内容的属性名是inputStream,那么可以省略这个参数 -->
<param name="inputName">inputStream</param>
<!--动态获取文件名,从Action中的取得filename-->
<param name="contentDisposition">
attachment;filename="${filename}"
</param>
<param name="bufferSize">2048</param>
</result>
<result name="input">/WEB-INF/pages/inputError.jsp</result>
</action>
参考API SteamResult(http://struts.apache.org/2.0.14/struts2-core/apidocs/org/apache/struts2/dispatcher/StreamResult.html),其中
contentType是内容类型,根据不同文件类型参照MIME标准设置,本例是文本。
contentDisposition是文件下载的处理方式,包括内联(inline)和附件(attachment),默认是inline, 使用附件时这样配置:attachment;filename="文件名" 。
若Action中验证失败,转到inputError页面。
相关文章推荐
- Struts2.0实现的文件上传(单附件和多附件)以及附件下载功能
- Struts2.0实现的文件上传(单附件和多附件)以及附件下载功能
- 基于struts 的实现文件的下载和删除功能
- Struts 2 实现文件下载功能
- Struts2.0实现的文件上传(单附件和多附件)以及附件下载功能
- Struts2.0实现的文件上传(单附件和多附件)以及附件下载功能
- java实现文件下载功能(Struts和普通下载)
- linux下实现ftp匿名用户的上传和下载文件功能
- asp.net中用FileStream类实现下载文件功能,自定义下载路径,像IE下载一样
- AngularJS基于http请求实现下载php生成的excel文件功能示例
- 关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)
- php实现文件下载功能的几个代码分享
- Struts实现文件下载中文乱码解决方案
- Struts 2中实现文件下载(修正中文问题)
- struts 2 实现文件下载 中文乱码问题
- WebView中实现文件下载功能
- 利用FTPClient类实现文件的上传下载功能
- Struts 2中实现文件下载(修正中文问题)
- java实现文件断点续传下载功能
- 基于struts 的FormFile实现文件的上传功能