当前位置:首页 > 谈天说地 > 正文内容

java思路是什么(java新手代码大全)

34资源网7个月前 (12-06)谈天说地93
站长推荐》》》》》摆摊地推这两款软件,一个月3000元-3万元轻松实现《《《《《站长推荐

今天在一个群里扯了半天的给一个初入职场的新手解释文件下载的问题,在此来总结下。

文件下载有两种方式:

静态文件下载

静态文件直接下载,设置下响应头即可。

//请求路径dowload
@RequestMapping("dowload")  
public void download(HttpServletResponse rep,String filename){
    //设置响应头的Content-Disposition属性为attachment(附件)
    rep.setHeader("Content-Disposition","attachment;filename="+filename);
}
动态文件下载

需要在下载的业务代码里面动态生成文件对象,然后将文件对象输出到网络输出流中。

比如创建一个xls文件并下载,使用的是easyexcel:

先封装一个私有的方法,将list数据封装在ExcelWriter对象中,写出到网络输出流中。

private void createXls(List<Contract> list, ServletOutputStream os) throws IOException{
            ExcelWriter writer = new ExcelWriter(os, ExcelTypeEnum.XLSX);
            Sheet sheet1 = new Sheet(1, 0);
            sheet1.setSheetName("合同列表");
            List<List<String>> data = new ArrayList<>();
            list.forEach(l -> {
                List<String> item = new ArrayList<>();
                Optional<String> contractName= Optional.ofNullable(l.getContractName());
                item.add(contractName.orElse(""));
                data.add(item);
            });
            List<List<String>> head = new ArrayList<List<String>>();
            List<String> headCoulumn1 = new ArrayList<String>();
            headCoulumn1.add("合同名称");
            head.add(headCoulumn1);
            Table table = new Table(1);
            table.setHead(head);
            writer.write0(data, sheet1, table);
            writer.finish();
}

调用方法

public void getxls(String name, String from, String to, HttpServletResponse response){
        if ( "".equals(from)) {
            from = "2020-01-01";
        }
        if ( "".equals(to)) {
            to = LocalDate.now().toString();
        }
        List<Contract> list = contractMapper.selectContractList(Wrappers.<Contract>lambdaQuery().like(Contract::getContractName, name)
                .between(Contract::getCreateDate, LocalDate.parse(from), LocalDate.parse(to)).orderByDesc(Contract::getCreateDate));
        String xlsName = from + "至" +to + "-合同列表";
        try {
            response.reset(); // 重点突出
            response.setCharacterEncoding("UTF-8"); // 重点突出
            response.setContentType("application/x-msdownload"); // 不同类型的文件对应不同的MIME类型 // 重点突出
            // 对文件名进行编码处理中文问题
            xlsName = new String((xlsName + ".xlsx").getBytes("GB2312"), "ISO-8859-1");
            // inline在浏览器中直接显示,不提示用户下载,默认
            // attachment弹出对话框,提示用户进行下载保存本地
            response.setHeader("Content-Disposition", "attachment;filename=" + xlsName);
            // 通过response流输出,直接输出到客户端浏览器中。
            ServletOutputStream os = response.getOutputStream();
            createXls(list,os);
            os.flush();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

另外:

静态文件下载需要服务端保存有下载名称的的磁盘文件,必须是真实存在的,文件的生成、删除需要手动处理。

而动态文件下载我们直接将文件对象流写入到网络输出流中,不必保存文件对象到磁盘中,它存在于内存中,会自动被回收处理。

文件的下载不论是动态还是静态都需要传入服务端一定的参数,参数获取我们通常采用get方式传参(URL传参)。

群里扯了半天的需要是这样的:管理员端生成一个特定条件的xls文件供多用户下载。

1.管理员端生成文件的操作是这样的,选择生成条件,post传递给服务端生成xls文件,在保存前先查询当前是否有此文件存在,如果有则删除后再保存。

2.用户端点击的是一个xxx.xx/getxls?filename=xxx的链接,获取的就是服务端保存的那个最新的文件。

每当管理员端重新设置条件生成xls文件后,用户端获取的都是最新的xls文件,因此这个文件名需要固定写死。

看完文章,还可以用支付宝扫描下面的二维码领取一个支付宝红包,目前可领1-88元不等

支付宝红包二维码

除了扫码可以领取之外,大家还可以(复制 720087999 打开✔支付宝✔去搜索, h`o`n.g.包哪里来,动动手指就能领)。

看下图所示是好多参与这次活动领取红包的朋友:

支付宝红包

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

本文链接:https://www.34l.com/post/2894.html

分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。