基于Strut2的文件上传下载实现

 

对于struts2 有对文件上传下载有很好的支持

Struts2的文件上传下载是要借助于第三方包的,具体也是apache开源组织的,他们具体为 commons-fileupload-1.2.2.jarcommons-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>

resultinput标签是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

ü 返回successstruts.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个参数,分别是contentTypecontentDisposition、以及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类中必须有一个返回类型为InputStreamgetDownloadFile方法来返回下载的文件入口——我们可以看到之前写的后台就是那样的,这也是之所以为什么把struts.xml放最后讲的原因。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值