对于struts2 有对文件上传下载有很好的支持
Struts2的文件上传下载是要借助于第三方包的,具体也是apache开源组织的,他们具体为 commons-fileupload-1.2.2.jar、commons-io-2.0.1.jar这两个包,一个控制上传/下载,一个控制流,当然,这里介绍的的文件上传下载只是一种方式而已。并不是说这样做就是效率合适的做法。
Strtus2的文件上传
1) 前台页面
前台页面需要有对于选择文件的支持。Struts的标签帮我们很好的解决了这个问题,具体代码如下:<s:form action="Upload.action" method="post"
enctype="multipart/form-data">
<s:file name="file" label="Picture"></s:file>
<s:submit value="Here we go"></s:submit>
</s:form>
我们是用的也是跟其他一样,用action提交给servlet,之后用了标签file,这个是sturts的标签,这样就会给一个目录选择,其他的,需要提的,是method以及enctype,这两个属性必须是post以及multipart/form-data,否则上传是无效的。
同时,你在使用标签前,需要确认的是,你已经在此页面导入了struts2的标签包,如下:
<%@ taglib prefix="s" uri="/struts-tags"%>
他们一般写在html标签前面。
2) Struts.xml控制文件
控制文件我们还跟平常一样,将请求递交到具体的java文件中去,具体写法如下:
<action name="Upload" class="ch2.helloworld.Upload">
<!-- 配置返回结果 -->
<result name="input">index.jsp</result>
<result name="success">
/ch2/helloworld/success.jsp</result>
<result name="error">/ch2/helloworld/error.jsp</result>
</action>
result的input标签是validate失败的时候的动作。
3) Action
这才是正题,我们先说下思想:
? 获取文件
? 创建文件流
? 进行写操作
? 关闭流
? 返回成功
O了,具体就是这样,那么具体是什么样的呢?我们先来了解下javabean上的东西
private List<File> file;
private List<String> fileFileName;
private List<String> fileContentType;
我们先在类中写了这些,我们来看下我们的第一个类属性是file,这个是对应页面上的struts标签<s:file name="file",我们看到name属性为file。接下来我们看第二个属性,以及第三个属性,貌似前台页面没有这些属性呢——是的,这个是文件上传时候特有的,这个属性我们的写法就是 name属性值+FileName以及name属性值+ContentType,同理,写出他们对应的get以及set方法。
接下来我们写上传
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
for (int i = 0; i < file.size(); i++) {
// 获得哪个文件输入流
InputStream is = new FileInputStream(file.get(i));
// 设置文件上传到的目的地路径
String root = ServletActionContext.getRequest().getRealPath(
"/update");
// 获取目标目录,以及生成文件名字
File destFile = new File(root, this.getFileFileName().get(i));
OutputStream os = new FileOutputStream(destFile); // 创建文件流对象
// 进行文件流写入
byte[] buffer = new byte[300];
int length = 0;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
os.flush();
is.close();
os.close();
}
return "success";
注释已经写得比较清楚了。具体就是创建好路径,获得上传对象,写入的操作。
u 关于其他
我们在这个实例中写的是对于上传多个文件的操作方式,所以我们看到的action是用list作为类属性的。如果只有一个上传文件,可以取消使用list就可以了。
Struts2文件下载
文件的下载实现主要要经过下几个步骤:
前台页面,struts.xml的书写,后台实现,我们将把struts.xml的实现放最后,因为需要后台的一些支持。
1) 前台页面
我们在前台是这么写的,同样需要struts的标签支持,同样要保证使用前导入了struts包(具体导入方法可看struts的文件上传中关于前台页面部分)
<body>
<s:a href="download.action">DownLoad</s:a><br/>
</body>
一个超链接。
2) 后台实现
我们后台所需要实现的是:
ü 实现excute方法,返回success;
ü 返回success,struts.xml中对应的actionfroward中指定java方法(默认在excute方法类中),此方法的具体返回应该为一个InputStream,具体写法如下:
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
public InputStream getDownloadFile() {
String path = "/update/幼儿.pdf";
// 取得目录文件流返回。
ServletActionContext.getServletContext().getResourceAsStream(path);
return
ServletActionContext.getServletContext().getResourceAsStream(path);
}
在上面,我们已经将2个方法写出,至于关于我们写的第二点,struts.xml的配置,我会在接下来讲述。
3) Struts.xml书写
我们在sturts.xml文件中需要这么写:
<action name="download" class="ch2.helloworld.DownloadFile">
<result name="success" type="stream">
<param name="contentType">
application/pdf;charset=UTF-8
</param>
<param name="contentDisposition">
attachment;file="幼儿.pdf"
</param>
<param name="inputName">downloadFile</param>
</result>
<result name="input">index.jsp</result>
</action>
这是一个struts.xml的一个action标签,也就是对应的下载部分的sturts.xml文件,我们在result中的success中是这么定义的,type值为stream,为流。之后再限定参数,在里面我们分别要限定3个参数,分别是contentType、contentDisposition、以及inputName,他们都有各自的意义,分别代表:
? contentType表示被下载文件的MIME类型,默认为text/plain,如果是其他类型我们需要在服务器中去找,比如tomcat,我们是在 \安装目录\Tomcat 6.0\conf\web.xml文件中查找对应的。
? contentDisposition表示下载文件的处理方式,有inline(默认)和attachment两种。若指定为inline模式,浏览器会先尝试直接打开文件,无法直接打开则弹出保存对话框;attachment模式则直接弹出文件保存对话框。语法格式为:<param>attachment;filename="example.txt"</param>。这时,无论服务器端真真被下载的文件名字是什么,文件保存对话框中显示的文件名都是example.txt。
? inputName表示下载文件的来源流。若inputName取值为downloadFile,则在相应的action类中必须有一个返回类型为InputStream的getDownloadFile方法来返回下载的文件入口——我们可以看到之前写的后台就是那样的,这也是之所以为什么把struts.xml放最后讲的原因。