jsp中从服务端下载文件

来源:互联网 发布:java 获取每个月 编辑:程序博客网 时间:2024/06/06 10:42

最近遇到一个问题,总结一下。

在网页中定义按钮,后台生成文件保存至服务器,前台jsp下载文件。

可以在jsp中设置一个下载按钮然后点击下载按钮通过onclick属性跳转另一个jsp,在另一个jsp中加载后台download方法实现文件的下载。

后台action中可以写个方法让 跳转后的jsp调用

/**

     *  FirstAction中文件下载的方法
     * @throws Exception
     */
    public void downLoad() throws Exception{
        //得到要下载的文件
         String fileName = "D:/apache-tomcat-8.5.12/webapps/txtResource/123456.txt";  
         fileName = new String(fileName.getBytes("UTF-8"),"UTF-8");        
        //处理文件名

       //  String realname = fileName.substring(fileName.indexOf("_")+1);   该方法是根据服务器上该文件的路径作为名字进行命名,不好。

      //为了防止下载文件名字重复又冲突以系统时间命名

        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd_HHmmss");    //取系统时间,想取什么样式的,在"yyyyMMdd_HHmmss"修改成什么样式的就行
         String realname=df.format(new Date())+".xls";            //  “+”号后面是你所下载的文件格式。也不能随便写,要和服务器上原文件格式一致。

        //设置响应头,控制浏览器下载该文件
         ServletActionContext.getResponse().setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
        //读取要下载的文件,保存到文件输入流
           FileInputStream in = new FileInputStream(fileName);
         //创建输出流
           OutputStream out =  ServletActionContext.getResponse().getOutputStream();
         //创建缓冲区
          byte buffer[] = new byte[1024];
          int len = 0;
          //循环将输入流中的内容读取到缓冲区当中
           while((len=in.read(buffer))>0){
           //输出缓冲区的内容到浏览器,实现文件下载
            out.write(buffer, 0, len);
             }                  
            //关闭文件输入流
              in.close();
            //关闭输出流
            out.close();

    }


jsp定义一个按钮:

  <input type="button"  id="testBtn"  value="下载文件" onclick="window.location.href='download.jsp';"  /> 

  //注意: 该按钮提交的action为:FirstAction。如果服务器上已存在选择onclick属性最佳选择。如果点击按钮后再创建文件,然后才下载的话,不能使用该方法控制下载操作和文件创建操作哪个先完成。如果是ajax提交。可以在ajax成功返回后里面运行方法window.location.href='xxx.jsp' ;" 来完成跳转。


定义另一个jsp,让该按钮按下的时候跳转。如:download.jsp

以下是download.jsp


<%@page import="com.bo.action.FirstAction"%>      //导入action,download方法在该类中为共有方法,以便调用
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
        <%
        FirstAction    dL = new FirstAction();
        dL.downLoad();

        out.clear();          //out为downLoad()方法中的流。 要加上以下两行代码,不然会报错getOutputStream() has already been called for this response  
        out = pageContext.pushBody();          

        %>    
        
</body>
</html>




   
0 0
原创粉丝点击