文件下载代码教程

本篇文章演示文件下载代码的完整教程。

演示文件下载

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<html>
<head>
    <base href="<%=basePath%>">
    <script type="text/javascript" src="jquery/jquery-1.11.1-min.js"></script>
    <title>演示文件下载</title>
<script type="text/javascript">
    $(function () {
        //给"下载"按钮添加单击事件
        $("#fileDownloadBtn").click(function () {
            //发送文件下载的请求
            window.location.href="workbench/activity/fileDownload.do";
        });
    });
</script>
</head>
<body>
<input type="button" value="下载" id="fileDownloadBtn">
</body>
</html>

演示文件下载Java代码(测试)

 @RequestMapping("/workbench/activity/fileDownload.do")
    public void fileDownload(HttpServletResponse response) throws Exception {
        //1.设置响应类型
        response.setContentType("application/octet-stream;charset=UTF-8");
        //2.获取输出流
        OutputStream out = response.getOutputStream();

        //浏览器接收到响应信息之后,默认情况下,直接在显示窗口中打开响应信息;即使打不开,,也会调用应用程序打开,只有实在打不开,才会激活文件下载窗口
        //可以设置响应头信息,使浏览器接收到响应信息之后,直接激活文件下载窗口,即使能打开也不打开
        response.addHeader("Content-Disposition", "attachment;filename=mystudentList.xls");

        //读取excel文件(inputStream),输出到浏览器(OutputStream)
        FileInputStream is = new FileInputStream("D:\\Out\\studentList.xls");
        byte[] buff = new byte[256];
        int len = 0;
        while ((len = is.read(buff)) != -1) {
            out.write(buff, 0, len);
        }
        is.close();
        out.flush();
    }
FileInputStream is = new FileInputStream("D:\\Out\\studentList.xls");
//这部分模拟的是从后台服务器下载到自己的电脑上,注意:仅仅是模拟

使用apach-poi生成excel文件(测试)

package com.bjpowernode.crm.poi;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
 * 使用apach-poi生成excel文件
 */
public class CreateExcelTest {
    public static void main(String[] args) throws Exception{
        //创建HSSFWorkbook对象,对应一个excel文件
        HSSFWorkbook wb = new HSSFWorkbook();
        //使用wb创建HSSFSheet对象,对应wb文件中的一页
        HSSFSheet sheet = wb.createSheet("学生列表");
        //使用sheet创建
        HSSFRow row = sheet.createRow(0);//行号:从0开始,依次增加
        //使用row创建HSSFCell对象,对应row中的列
        HSSFCell cell = row.createCell(0);//列得编号:从0开始,依次增加
        cell.setCellValue("学号");

        cell = row.createCell(1);//第1列
        cell.setCellValue("姓名");

        cell = row.createCell(1);//第2列
        cell.setCellValue("姓名");

        //生成HSSCellStyle对象,修饰
        HSSFCellStyle style = wb.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);

        //循环
        for (int i = 1; i <= 10; i++) {
            row = sheet.createRow(1);

            cell = row.createCell(0);//列得编号:从0开始,依次增加
            cell.setCellValue(100+i);

            cell = row.createCell(1);//第1列
            cell.setCellValue("NAME" + i);

            cell = row.createCell(1);//第2列
            cell.setCellStyle(style);//居中
            cell.setCellValue(20 + i);
        }
            //调用工具函数,生成excel文件
            FileOutputStream fo = new FileOutputStream("D:\\Out\\studengList.xls");
            wb.write(fo);
    }
}

使用apach-poi生成excel文件并导出

 @RequestMapping("/workbench/activity/exportAllActivitys.do")
    public void exportAllActivitys(HttpServletResponse response) throws Exception {
        //调用Service方法
        List<Activity> activityList = activityService.queryAllActivitys();
        //创建ecxel文件,并且把activiyList写入到excel文件中
        //创建HSSFWorkbook对象,对应一个excel文件
        HSSFWorkbook wb = new HSSFWorkbook();
        //使用wb创建HSSFSheet对象,对应wb文件中的一页
        HSSFSheet sheet = wb.createSheet("市场活动");
        //使用sheet创建
        HSSFRow row = sheet.createRow(0);//行号:从0开始,依次增加
        HSSFCell cell = row.createCell(0);//列得编号:从0开始,依次增加
        cell.setCellValue("ID");
        cell = row.createCell(1);
        cell.setCellValue("所有者");
        cell = row.createCell(2);
        cell.setCellValue("名称");
        cell = row.createCell(3);
        cell.setCellValue("开始日期");
        cell = row.createCell(4);
        cell.setCellValue("结束日期");
        cell = row.createCell(5);
        cell.setCellValue("成本");
        cell = row.createCell(6);
        cell.setCellValue("描述");
        cell = row.createCell(7);
        cell.setCellValue("创建时间");
        cell = row.createCell(8);
        cell.setCellValue("创建者");
        cell = row.createCell(9);
        cell.setCellValue("修改时间");
        cell = row.createCell(10);
        cell.setCellValue("修改者");

        //遍历List,创建HSSFRow对象
        if (activityList != null && activityList.size() > 0) {
            Activity activity = null;
            for (int i = 0; i < activityList.size(); i++) {
                activity = activityList.get(i);

                //每遍历出一个activity,生成一行
                row = sheet.createRow(i + 1);

                cell = row.createCell(0);//列得编号:从0开始,依次增加
                //每一行有11列,每一列的数据从activity中获取
                cell.setCellValue(activity.getId());
                cell = row.createCell(1);
                cell.setCellValue(activity.getOwner());
                cell = row.createCell(2);
                cell.setCellValue(activity.getName());
                cell = row.createCell(3);
                cell.setCellValue(activity.getStartDate());
                cell = row.createCell(4);
                cell.setCellValue(activity.getEndDate());
                cell = row.createCell(5);
                cell.setCellValue(activity.getCost());
                cell = row.createCell(6);
                cell.setCellValue(activity.getDescription());
                cell = row.createCell(7);
                cell.setCellValue(activity.getCreateTime());
                cell = row.createCell(8);
                cell.setCellValue(activity.getCreateBy());
                cell = row.createCell(9);
                cell.setCellValue(activity.getEditTime());
                cell = row.createCell(10);
                cell.setCellValue(activity.getEditBy());
            }
        }
        //根据wb对象,生成excel对象
        /*FileOutputStream os = new FileOutputStream("D:\\Out\\activityList.xls");
        wb.write(os);
        os.close();
        wb.close();*/

        //把excel文件下载到客户端
        //1.设置响应类型
        response.setContentType("application/octet-stream;charset=UTF-8");
        //浏览器接收到响应信息之后,默认情况下,直接在显示窗口中打开响应信息;即使打不开,,也会调用应用程序打开,只有实在打不开,才会激活文件下载窗口
        //可以设置响应头信息,使浏览器接收到响应信息之后,直接激活文件下载窗口,即使能打开也不打开
        response.addHeader("Content-Disposition", "attachment;filename=activityList.xls");
        ServletOutputStream out = response.getOutputStream();
        /*FileInputStream is = new FileInputStream("D:\\Out\\activityList.xls");
        byte[] buff = new byte[256];
        int len = 0;
        while ((len = is.read(buff)) != -1) {
            out.write(buff,0,len);
        }
        is.close();*/
        wb.write(out);
        wb.close();
        out.flush();
    }

在这里我们注释了如下代码:
在这里插入图片描述
在这里插入图片描述
为什么这么做呢?
在这里插入图片描述
如果我们使用被我们注释的代码,那么Excel文件的传输方式如上图,这样就会导致效率变低,我们优化代码,

ServletOutputStream out = response.getOutputStream();
//使用该代码,Excel文件的传输方式就是如下图,运行效率提高。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值