• response的Content-Length设置错误,导致springboot文件下载,代码已经return,postman一直等待到超时


    最近在工作中遇到了文件下载的需求,
    期初以为也很简单,

    DownloadController

    package com.example.duohoob.controller;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.net.URLEncoder;
    
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.io.IOUtils;
    import org.springframework.http.HttpHeaders;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author yangwei
     * @date 2022年11月3日
     */
    @RestController
    public class DownloadController {
    
    	/**
    	 * 下载
    	 * @author yangwei
    	 * @date 2022年11月7日
    	 * @param response
    	 * @throws Exception
    	 */
    	@RequestMapping("/download")
    	public void download(HttpServletResponse response) throws Exception {
    		response.setCharacterEncoding("utf-8");
    		response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("temp.txt", "utf-8"));
    		
    		// 注意,就是这一句,10k!
    		response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(10240));
    		
    		// temp.txt文件大小在5k左右
    		File file = new File("D:\\doc\\temp.txt");
    		FileInputStream fis = new FileInputStream(file);
    		ServletOutputStream sos = response.getOutputStream();
    		IOUtils.write(IOUtils.toByteArray(fis), sos);
    	}
    	
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    启动后访问,localhost:8080/download
    在这里插入图片描述
    请求处理完后,postman 一直在等待,
    response的head儿中设置了content-length,导致写出的数据不相等时,
    postman 便一直等待,直至超时,
    已写出的数据就是byte字节数组,后台已经处理完并且return。

    这样奇怪的问题我还是第一次遇到,

    在浏览器是这样,
    在这里插入图片描述
    在这里插入图片描述
    我还以为是文件有问题,找了半天也不知道是什么原因,

    后来发现了之前别人留下的这一行。。。

    response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(10240));
    
    • 1

    我***!

    这一句在header中设置了内容的大小Content-Length是10240个字节,
    是10k,temp.txt文件大小在5k左右,这就导致response以为没下完,

    便一致在等待,当然是等不到什么结果的,
    后来把这一行去掉问题解决了。

  • 相关阅读:
    网络安全渗透测试工具AWVS14.6.2的安装与使用(激活)
    mysql 设置远程登录
    Stable Diffusion 告别猜关键词,LoRA适配关键词自动生成
    【JS 的数据类型】
    Allegro Design Entry HDL(OrCAD Capture HDL)视图管理菜单详细介绍
    链表-哈希表 详解
    [Java]细节与使用经验
    Docker从初学到进阶二(使用Docker命令,自定义镜像,部署微服务集群,配置自己的镜像仓库)
    研究生英语复习(一)
    思科大作业
  • 原文地址:https://blog.csdn.net/qq_35549286/article/details/127665761