信息发布→ 登录 注册 退出

Springboot如何通过流返回文件

发布时间:2026-01-11

点击量:
目录
  • 如何通过流返回文件
    • controller类如下
    • 工具类DownLoadUtils如下
  • 以流的方式直接返回

    如何通过流返回文件

    本人的文件是放在resource/templates目录下,截图如下

    controller类如下

        @GetMapping(value = "/downfile")
        public void download(HttpServletResponse response) throws IOException {
            String fileName = "template.xlsx";
            // 设置信息给客户端不解析
            String type = new MimetypesFileTypeMap().getContentType(fileName);
            // 设置contenttype,即告诉客户端所发送的数据属于什么类型
            response.setHeader("Content-type",type);
            // 设置编码
            String code = new String(fileName.getBytes("utf-8"), "iso-8859-1");
            // 设置扩展头,当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。
            response.setHeader("Content-Disposition", "attachment;filename=" + code);
            response.setContentType("application/octet-stream;charset=ISO8859-1");
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
            DownLoadUtils.download(fileName, response);
        }

    工具类DownLoadUtils如下

    public class DownLoadUtils { 
        public static void download(String filename, HttpServletResponse res) throws IOException {
            // 发送给客户端的数据
            // 读取filename
            ClassPathResource classPathResource = new ClassPathResource("templates/"+filename);
            long length = classPathResource.getFile().length();
            res.addHeader("Content-Length",String.valueOf(length));
            OutputStream outputStream = res.getOutputStream();
            byte[] buff = new byte[1024];
            BufferedInputStream bis = null;
            InputStream inputStream =classPathResource.getInputStream();
            bis = new BufferedInputStream(inputStream);
            int i = bis.read(buff);
            while (i != -1) {
                outputStream.write(buff, 0, buff.length);
                outputStream.flush();
                i = bis.read(buff);
            }
            bis.close();
            outputStream.close();
        }
    }

    注意点

    response.addHeader("Content-Length",String.valueOf(file.length()));

    如果不加这句代码,下载下来的文件会 在打开前提示修复,文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配

    以流的方式直接返回

    import java.io.FileReader;
    import java.io.InputStream;
    import java.util.Properties;
    /*
     */
    public class Reflect {
        public static void main(String[] args) throws Exception{
           //获取一个文件的绝对路径!!!
            // 这种是先获得绝对路径然后在转换成流。
    //        String path = Thread.currentThread().getContextClassLoader()
    //                .getResource("classinfo2.properties").getPath();
    //        FileReader reader = new FileReader(path);
            //下面这种是直接用流的方式返回。
            InputStream reader = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("classinfo2.properties");
            Properties pro = new Properties();
            pro.load(reader);
            reader.close();
            //通过key获取value。
            String className = pro.getProperty("className");
            System.out.println(className);
        }
    }
    

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持。 

    在线客服
    服务热线

    服务热线

    4008888355

    微信咨询
    二维码
    返回顶部
    ×二维码

    截屏,微信识别二维码

    打开微信

    微信号已复制,请打开微信添加咨询详情!