当前位置: 首页 > article >正文

Springboot 下载附件

@GetMapping("/download")
public void download(@RequestParam String fileId, HttpServletResponse response) throws IOException {
        // 查询文件信息
        SysFileEntity sysFileEntity = fileService.queryFileById(fileId);
        response.setContentType("application/octet-stream");
        response.addHeader("Content-Length", "" + sysFileEntity.getSize());  // 文件大小
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(sysFileEntity .getFileName(), "UTF-8"));
        int bufferSize = 8 * 1024;
        File file = new File(sysFileEntity.getFilePath());
        # 指定 读、写缓冲区大小。不填时默认 缓冲区大小8192byte
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file), bufferSize);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream(), bufferSize);
        try {
            
            // 设置缓冲区
            byte[] bytes = new byte[bufferSize];
            int len;
            while ((len = bufferedInputStream.read(bytes, 0, bytes.length)) > 0){
                bufferedOutputStream.write(bytes, 0, len);
            }
            bufferedOutputStream.flush();
        }catch (Exception e){
            logger.error("下载附件出错", e);
        }finally {
            IoUtil.close(bufferedOutputStream);
            IoUtil.close(bufferedInputStream);
        }
    }

注意!!!!!!

response.setContentType("application/octet-stream");
response.addHeader("Content-Length", "" + sysFileEntity.getSize());  // 文件大小
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(sysFileEntity .getFileName(), "UTF-8"));

上述代码需写在response.getWriter或response.getOutputStream方法被调用之前。否则response.setContentType会不生效。

  1. 确保在调用response.setContentType方法之前,response.getWriter或response.getOutputStream方法没有被调用。因为一旦获取了响应的输出流或写入器,设置内容类型将不起作用。

  2. 确保在调用response.setContentType方法之前,没有向客户端发送任何数据。一旦开始向客户端发送数据,设置内容类型将不起作用。


http://www.kler.cn/a/465187.html

相关文章:

  • JAVA构造方法练习
  • Linux驱动开发(18):linux驱动并发与竞态
  • 【光纤通信】光纤结构
  • Elasticsearch与数据库数据一致性:最佳实践与解决方案
  • FastAPI 路由与请求处理机制
  • 《Vue3实战教程》40:Vue3安全
  • 靶场搭建问题(技巧)总结
  • DEWA功能介绍
  • Redis 中 Lua 脚本的使用详解
  • 络安全警钟:通过Microsoft Teams和AnyDesk传播的DarkGate恶意软件
  • JavaScript 的 requestAnimationFrame
  • 如果Adobe 退出中国后怎么办
  • 安全框架:Apache Shiro
  • Springboot数据层开发 — 整合jdbcTemplate、mybatis
  • Word格式修改
  • Nginx知识详解(理论+实战更易懂)
  • PDF预览插件
  • 服务器数据恢复—离线盘数超过热备盘数导致raidz阵列崩溃的数据恢复
  • 【微软,模型规模】模型参数规模泄露:理解大型语言模型的参数量级
  • 基于MongoDB和PostgreSQL的百货公司进销管理系统
  • 李宏毅机器学习笔记-自注意力机制(self-attention)
  • HTML——57. type和name属性
  • QML学习(一) Qt Quick和QML介绍以及适用场景说明
  • linux最常用最新基础命令
  • vscode实用插件(持续更新)
  • QT集成IntelRealSense双目摄像头3,3D显示