Spring MVC的文件下载实例详解
读取文件
要下载文件,首先是将文件内容读取进来,使用字节数组存储起来,这里使用spring里面的工具类实现
import org.springframework.util.FileCopyUtils;
public byte[] downloadFile(String fileName) {
byte[] res = new byte[0];
try {
File file = new File(BACKUP_FILE_PATH, fileName);
if (file.exists() && !file.isDirectory()) {
res = FileCopyUtils.copyToByteArray(file);
}
} catch (IOException e) {
logger.error(e.getMessage());
}
return res;
}
这个数组就是文件的内容,后面将输出到响应,供浏览器下载
下载文件的响应
下载文件的响应头和一般的响应头是有所区别的,而这里面还要根据用户浏览器的不同区别对待
我把生成响应的代码封装成了一个方法,这样所有下载响应都可以调用这个方法了,避免重复代码到处写
protected ResponseEntity<byte[]> downloadResponse(byte[] body, String fileName) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.getRequestAttributes()).getRequest();
String header = request.getHeader("User-Agent").toUpperCase();
HttpStatus status = HttpStatus.CREATED;
try {
if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {
fileName = URLEncoder.encode(fileName, "UTF-8");
fileName = fileName.replace("+", "%20"); // IE下载文件名空格变+号问题
status = HttpStatus.OK;
} else {
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
}
} catch (UnsupportedEncodingException e) {}
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", fileName);
headers.setContentLength(body.length);
return new ResponseEntity<byte[]>(body, headers, status);
}
这里需要注意,一般来说下载文件是使用201状态码的,但是IE浏览器不支持,还得我花了很大力气才找出来是那个问题
其中对文件名的处理是为了防止中文以及空格导致文件名乱码
控制器方法
在控制器的那里需要对返回值进行处理
@RequestMapping(value = "/download-backup", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<byte[]> downloadBackupFile(@RequestParam String fileName) {
byte[] body = backupService.downloadFile(fileName);
return downloadResponse(body, fileName);
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“Spring MVC的文件下载实例详解”评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新动态
2025年11月01日
2025年11月01日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]