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

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);
	}
	
}

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

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

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

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

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

我***!

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

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐