用户管理的设计--6.文件下载的两种方式

页面效果


实现步骤

1.Jsp页面要求

<TD class="ta_01" align="center" bgColor="#f5fafe">附件(下载):</TD>
<TD class="ta_01" bgColor="#ffffff" colSpan="3">
   <s:if test="elecUserFiles!=null && elecUserFiles.size()>0">
      <s:iterator value="elecUserFiles">
          <a href="#" onclick="openWindow(‘${pageContext.request.contextPath }/system/elecUserAction_download.do?fileID=<s:property value="fileID"/>‘,‘700‘,‘400‘);">
               <s:property value="fileName"/>
          </a>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<s:date name="progressTime" format="yyyy-MM-dd HH:mm:ss"/>
          <br>
      </s:iterator>
   </s:if>
 </TD>

2.VO对象中添加非持久化javabean属性

//附件ID
private String fileID;
public String getFileID() {
     return fileID;
}
public void setFileID(String fileID) {
   this.fileID = fileID;
}

3.两种文件下载方式

方式一:不使用struts2提供的文件下载(普通方式)

  Action类中添加方法:

    /**
    * @Name: download
    * @Description: 文件下载(普通方式)
    * @Parameters: 无
    * @Return: 无
    */
    public String download(){
        try {
            //1.获取文件ID
            String fileID = elecUser.getFileID();

            //2.根据文件ID,查询附件表,获取路径path
            ElecUserFile elecUserFile = elecUserService.findUserfileByID(fileID);
            //(1)获取路径
            String path = ServletActionContext.getServletContext().getRealPath("") + elecUserFile.getFileURL();
            //(2)获取文件名
            String fileName = elecUserFile.getFileName();
            //(3)可能出现中文,解决中文乱码问题
            fileName=new String(fileName.getBytes("gbk"),"iso8859-1");
            //(4)填写下载文件的头部信息
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);

            //3.使用路径path,查找到对应的文件,转化成InputStream
            FileInputStream fileInputStream = new FileInputStream(new File(path));

            //4.从响应对象response中获取输出流
            OutputStream outputStream = response.getOutputStream();

            //5.将输入流数据读出写到输出流
            byte[] buf=new byte[1024];
            int length=0;
            while((length=fileInputStream.read(buf))!=-1){
                outputStream.write(buf, 0, length);
            }
            outputStream.close();
            fileInputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return NONE;
    }

方式二:使用struts2提供的文件下载

第一步:配置struts.xml

<result name="download" type="stream">
      <param name="inputName">inputStream</param>
      <param name="contentDisposition">attachment;filename="${#request.fileName}"</param>
      <param name="bufferSize">1024</param>
</result>

第二步:VO对象中,添加InputStream类型的属性

在模型驱动的对象中,添加InputStream类型的属性主要用来存放文件的输入流,其中属性名称要与struts.xml中定义的inputName的值一致。

//文件下载的流的属性
private InputStream inputStream;
public InputStream getInputStream() {
    return inputStream; }
public void setInputStream(InputStream inputStream) {
    this.inputStream = inputStream;
}

第四步:Action类中添加代码

    /**
    * @Name: download
    * @Description: 文件下载(struts2的方式)
    * @Parameters: 无
    * @Return: struts2的结果类型
    */
    public String download(){
        try {
            //1.获取文件ID
            String fileID = elecUser.getFileID();

            //2.根据文件ID,查询附件表,获取路径path
            ElecUserFile elecUserFile = elecUserService.findUserfileByID(fileID);
            //(1)获取路径
            String path = ServletActionContext.getServletContext().getRealPath("") + elecUserFile.getFileURL();
            //(2)获取文件名
            String fileName = elecUserFile.getFileName();
            //(3)可能出现中文,解决中文乱码问题
            fileName=new String(fileName.getBytes("gbk"),"iso8859-1");
            request.setAttribute("fileName", fileName);

            //3.使用路径path,查找到对应的文件,转化成InputStream
            FileInputStream fileInputStream = new FileInputStream(new File(path));

            //4.与栈顶的inputStream关联,将查询的文件输入流放置到模型驱动定义的inputStream属性中,用来输出文件
            elecUser.setInputStream(fileInputStream);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "download";
    }
时间: 2025-01-02 17:58:44

用户管理的设计--6.文件下载的两种方式的相关文章

JSP隐含对象response实现文件下载的两种方式

一.JSP隐含对象response实现文件下载的介绍 (1)在JSP中实现文件下载最简单的方法是定义超链接指向目标资源,用户单击超链接后直接下载资源,但直接暴露资源的URL 也会带来一些负面的影响,例如容易被其它网站盗链,造成本地服务器下载负载过重. (2)另外一种下载文件的方法是使用文件输出流实现下载,首先通过response报头告知客户端浏览器,将接收到的信息另存 为一个文件,然后用输出流对象给客户端传输文件数据,浏览器接收数据完毕后将数据另存为文件,这种下载方法的优点是服 务器端资源路径的

移动端针对图片过多时,为了提高用户体验性,常采用的两种方式

<1>由于在手机上网络请求太多会造成阻塞,特别是ios设备,然后针对图片的话: 针对图片 一个是做懒加载   提供插件(jquer.lazyload.min.js) 一个是压缩图片尺寸 <2>在说说预加载图片是提高用户体验的一个很好方法,图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.本文将分享三个不同的预加载技术,来增

网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别

1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2次. >强烈依赖数据库的驱动jar 解决办法: Class.forName("com.mysql.jdbc.Driver"); 1.1.2 API详解:java.sql.Statement接口: 操作sql语句,并返回相应结果 String sql = "某SQL语句&qu

day2-操作系统,编程语言分类,执行Python程序的两种方式,变量,python的内存管理,

1    什么是操作系统 操作系统位于计算机与应用软件之间,是一个协调,管理,控制计算机硬件资源与软件资源的控制程序 2     为何要有操作系统? 1,控制硬件. 2,把对硬件的复杂的操作封装成优美简单的接口,给用户或者应用程序去使用 注意:一套完整的计算机系统包含三部分 应用程序:比如QQ,暴风影音 操作系统:比如windows linux unix 计算机硬件 强调:我们以后开发的都是应用程序,应用程序无法直接操作硬件,但凡要操作硬件,都是调用操作系统的接口 3 编程语言的分类 1,机器语

操作系统,编程语言分类,执行python两种方式,变量,内存管理,定义变量的三个特征

操作系统 1.什么是操作系统 操作系统位于计算机硬件与应用软件之间 是一个协调.管理.控制计算机硬件资源与软件资源的控制程序 2.为何要有操作系统? 1.控制硬件 2.把对硬件的复杂的操作封装成优美简单的接口(文件),给用户或者应用程序去使用 注意:一套完整的计算机系统包含三部分 应用程序:qq,暴风影音,快播 操作系统:windows,linux,unix 计算机硬件 强调: 我们以后开发的都是应用程序 应用程序无法直接操作硬件,但凡要操作硬件,都是调用操作系统的接口 编程语言分类 1.机器语

内存分配原理 -进程分配内存的两种方式,分别有系统调用完成brk() 和mmap()(不设计共享内存)

如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误.           这两个数值表示一个进程自启动以来所发生的缺页中断的次数. 发成缺页中断后,执行了那些操作? 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1.检查要访问的虚拟地址是否合法 2.查找/分配一个物理页 3.填充物理页内容(读取磁盘,或者直接置0

26.OpenIdConnect获取用户信息的两种方式

openId在OAuth基础之上,在下面这红框内拿到Authorization Code之后还可以返回IdToken. IdToken和AccessToken一起返回.IdToken就会包括了用户的信息Claims .通过我们的ProfileService返回回去. 也就是这里 设置为True了 ,就会把新用户的信息都包含在IdToken里面返回给用户,第三方拿到IdToken就可以用了不需要再去获取AccessToken,这是一种方式 另外一种方式是IdToken里面不包含用户的信息.它会有一

在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式,虽然Web API或者WCF方式的调用,相对直接连接数据库方式,响应效率上略差一些,不过扩展性强,也可以调动更多的设备接入,包括移动应用接入,网站接入,Winfrom客户端接入,这样可以使得服务逻辑相对独立,负责提供接口即可.这种方式中最有代表性的就是当前Web API的广泛应用,促进了各个接入端

虚拟机设备直通的两种方式(Working in Progress)

声明: 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习.研究和总结,如有雷同,实属荣幸! pci passthrough 概念 允许guest排他使用host上的某个PCI设备,就像将该设备物理连接到guest上一样. 使用场景 提升性能(如直通网卡和显卡) 降低延迟(避免数据丢失或丢祯) 直接利用bare-metal上设备的驱动 用法1 需要CPU支持VT-d.主板也支持该技术. 预先配置: 打开bios中的VT