SpringMVC 实现在页面下载文件(非服务器式下载)

首先页面的下载代码如下:

<a href="javascript:void(0);" style="font-size:14px;cursor:pointer;color:red" onclick="downDatasourceFile(${detailId})">《数据授权申请-数据源-需求编号:${detailId}》
 </a>

页面定义了a标签,通过onclick事件来实现文件的下载行为。

下面是onclick事件的内容:

function downDatasourceFile(detailId, flag){
    window.location.href = "/DataSourceController/getDatasourceTemplate?detailId=" + detailId;
}

点击事件实现跳转到controller中进行处理,而controller的内容如下:

/**
     *生成源数据库权限申请模板文件
     * @param request
     * @param response
     * @return excel文件
     * @throws UnsupportedEncodingException
     */
    @RequestMapping("getDatasourceTemplate")
    public String getDatasourceTemplate(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
        //获取需求ID
        String detailId = request.getParameter("detailId");
        String fileName = "";
        if (StringUtils.isNotBlank(detailId)) {
            List<DatabaseInfo> dbs = null;
            OutputStream os = null;
            List<Integer> tableIds = new ArrayList<Integer>();
            List<TableInfo> tableInfos = tableInfoService.selectByDetailId(detailId);
            for (TableInfo tableInfo : tableInfos) {
                tableIds.add(tableInfo.getId());
            }
            dbs = databaseInfoService.getDatabaseInfosByTableIds(tableIds);
            fileName = "数据授权申请-数据源-需求编号:" + detailId + ".xls";
            HSSFWorkbook wb = DatasourceTemplate.getTemplateFile(dbs);
            response.setCharacterEncoding("utf-8");
            response.setContentType("multipart/form-data");
            response.setHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes("gbk"), "iso-8859-1"));
            response.setHeader("Content-type", "charset=UTF-8");
            try {
                os = response.getOutputStream();
                wb.write(os);
                os.close();
                os.flush();
                os.close();
                response.flushBuffer();
            } catch (Exception e) {
            }

        }
        return null;
    }

一般如果采用a标签的herf方式链接文件从而下载文件,是需要先生成文件的,要么存在工程里,要么存在服务器上。不论是哪种方式都复杂了些,并且耗时。如果文件不是一成不变的,是由网页上其他内容所决定的,并且要实时的生成,还不想用文件服务器什么的,那这个方法一定适合你。

controller中:

HSSFWorkbook wb = DatasourceTemplate.getTemplateFile(dbs);

是生成的Excel文件的工具类生成的一个HSSFWorkbook 对象,由response输出流写出到页面上展示。

下面的代码是因为文件名中有中文,这样设置一下,可以让中文正常显示。

new String(fileName.getBytes("gbk"), "iso-8859-1")

整个实现,最重要的就是给response设置的那几个参数。

response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" +filename));
response.setHeader("Content-type", "charset=UTF-8");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值