版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/72764335
一、前言
上一篇博客我们了解了ssh框架的springmvc的文件下载功能,它在方法里面并不需要设置返回的http的类型和标题,但也能自动弹出下载框,这就是框架本身的一个优点,封装了原生java的方法。
不同框架的对文件下载的方式也不尽相同,那么,今天我们将重点放在ssh中的struts2的文件下载方式,直接切入主题:
二、实例
1. xml配置
<!-- action的type设置成stream,inputName为方法内部的输入流名称,xml会自动识别 -->
<action name="download_*" class="downloadAction" method="{1}">
<result name="downloadfile" type="stream"> <!--定义返回值为流-->
<param name="contentType">image/jpeg</param> <!--返回文件类型-->
<param name="inputName">inputStream</param> <!--方法内部使用的流的名称-->
<!--文件下载的处理方式-->
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="bufferSize">2048</param> <!--下载缓冲区的大小-->
</result>
<result name="error">error.jsp</result>
</action>
<!--参数说明:
1、type 需设置成 stream ,表明该返回值为流
2、contentType
内容类型,和互联网MIME标准中的规定类型一致,例如application/vnd.ms-excel代表excel表格,
text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片;
如果不写,则会匹配所有的文件,也就是所有的文件都可以下载;
3、inputName
下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,
例如取值为inputStream的属性需要编写getInputStream()方法
4、contentDisposition
文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,
否则浏览器会尝试直接显示文件。取值为:attachment;filename="test.jpg",表示文件下载的时候保存
的名字应为test.jpg。如果直接写filename="test.jpg",那么默认情况是代表inline,浏览器会尝试
自动打开它,等价于这样的写法:inline;filename="test.jpg"
5、bufferSize
下载缓冲区的大小,默认为1024字节,可自行定义
-->
2.方法实例
//从前台获取的文件名(包括文件格式,例如"test.jpg")
private String fileName;
//定义输入流,名称和xml里面的<param name="inputName">的名称一样
private InputStream inputStream;
//定义好set和get方法,可自动获取匹配
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
//返回时xml会根据输入流名称,识别方法内部的输入流
public String qtDownloadFile() throws FileNotFoundException{
//获取需要下载的文件的相对文件夹路径
String basePath = ServletActionContext.getServletContext().getRealPath("/file");
//根据文件夹路径和文件名,创建file文件
File file = new File(basePath,fileName);
//用输入流读取文件
inputStream = new FileInputStream(file);
return "downloadfile"; //返回的是xml的对应的action的名称
}
三、总结
1.ssh框架的文件下载功能也比较容易实现,在controller层使用的代码不多,就是将文件使用输入流读取就可以了,而需要特别注意的地方就是xml的配置,因为struts2的返回文件下载处理方式基本是交给了xml去控制,将文件下载的xml的基本配置搞明白了之后基本上也就没什么难度了;
2.实践是检验认识真理性的唯一标准,根据代码和注释多进行尝试,则很快就会明白其中的原理
上一篇:ssh框架之springmvc文件下载功能代码
下一篇:jfinal框架文件下载功能代码