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

springboot传输文件,下载文件

原文:

https://mp.weixin.qq.com/s/TeC5m9Fc6Zjo-VBYKPH7kAhttps://mp.weixin.qq.com/s/TeC5m9Fc6Zjo-VBYKPH7kA

效果:

下面是源码,直接拷贝使用即可:

@GetMapping("/download")@FileDownload(fileName = "hello.xls")public File download() {// excel传输,请不要使用xlsx,请使用xls。1.xlsx莫名其妙传输文件损坏,传输代价太高了。// 文件位置不要放在resources目录下,最佳实践就是直接用File文件io读取,中间二进制文件,二进制流不会被奇奇怪怪的莫名变成字符流,特别容易乱码。File temp = new File("C:\\Users\\六件套\\IdeaProjects\\huiren_academy\\huiren-module-study\\src\\main\\resources\\hello.xls");return temp;}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FileDownload {String fileName() default "default.txt"; //下载下来的文件名String contentType() default "application/octet-stream";
}
@Aspect
@Component
public class FileDownloadAspect {@Around("@annotation(fileDownload)")public Object handleFileDownload(ProceedingJoinPoint pjp, FileDownload fileDownload) throws Throwable {HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();response.setContentType(fileDownload.contentType());String fileName = URLEncoder.encode(fileDownload.fileName(), "UTF-8");response.setHeader("Content-Disposition", "attachment; filename=" + fileName);Object result = pjp.proceed();if (result instanceof byte[]) {try (OutputStream os = response.getOutputStream()) {os.write((byte[]) result);}} else if (result instanceof File) {try (InputStream is = new FileInputStream((File) result); OutputStream os = response.getOutputStream()) {FileCopyUtils.copy(is, os);}} else if (result instanceof Path) {Files.copy((Path) result, response.getOutputStream());} else if (result instanceof InputStream) {try (InputStream is = (InputStream) result; OutputStream os = response.getOutputStream()) {byte[] buffer = new byte[8192];int len;while ((len = is.read(buffer)) != -1) {os.write(buffer, 0, len);}}}return null;}
}

一些❌错误例子:

1.死不听劝,非要用类路径classpath下的(resources文件里面的文件)。我试过了,会报错。

2.他还是想要用resources目录下的文件,于是他就迂回一下,先用ClassPathResource读出来,再写到临时文件中。用这个临时文件传输。是可以网络传输的,但是下载下来的文件会乱码。对于二进制文件,不要这么用。我这里会打开文件还会乱码报错哈!

3.传输excel文件,非要用xlsx,搞了一个小时都不知道咋搞,劝你先用xls传输

// 1. 在系统临时目录里建文件File temp = File.createTempFile("hello", ".xls");temp.deleteOnExit();                       // JVM 退出时尽量清理// 2. 纯字节拷贝:classpath -> 临时文件try (InputStream in = new ClassPathResource("hello.xls").getInputStream();OutputStream out = Files.newOutputStream(temp.toPath())) {in.transferTo(out);                    // JDK 9+,零拷贝// 如果 JDK 8 用 IOUtils.copy(in, out) 或 FileCopyUtils.copy(in, out)}return temp;                               // 交给切面,字节完整

这个还是很复杂的,请好好复习JavaSE的IO和网络的IO

如果有人实现了用类路径的,麻烦补充一下在评论区。我也很想知道


文章转载自:

http://Hg2iSKfG.jbysr.cn
http://zHjCeQv7.jbysr.cn
http://JYG56XRd.jbysr.cn
http://QehX8sI0.jbysr.cn
http://8PhAZ2Qc.jbysr.cn
http://G91r392b.jbysr.cn
http://Z2sgzcnX.jbysr.cn
http://tvmIgOp8.jbysr.cn
http://uPs6XpWn.jbysr.cn
http://OfSn6NKL.jbysr.cn
http://ARIfRESE.jbysr.cn
http://Zf4M7aUh.jbysr.cn
http://xeyK1L7J.jbysr.cn
http://MvUMjeBk.jbysr.cn
http://E5PPCWfO.jbysr.cn
http://GYbuSsST.jbysr.cn
http://pd2f2KSz.jbysr.cn
http://fco5NxcW.jbysr.cn
http://6bDrekF5.jbysr.cn
http://xnuTi3U2.jbysr.cn
http://nU1CPsE4.jbysr.cn
http://HlBfeIvC.jbysr.cn
http://5fjsmv5F.jbysr.cn
http://MtzwbKee.jbysr.cn
http://MMqxqlgV.jbysr.cn
http://k5w7TtLv.jbysr.cn
http://msn1CwEl.jbysr.cn
http://0hdFTP5c.jbysr.cn
http://1dBeSGWx.jbysr.cn
http://ve7SY8KW.jbysr.cn
http://www.dtcms.com/a/387138.html

相关文章:

  • 基于51单片机的出租车计价器霍尔测速设计
  • 【笔记】Agent应用开发与落地全景
  • C++ STL底层原理系列学习路线规划
  • LAN口和WAN口
  • Dify + Bright Data MCP:从实时影音数据到可落地的智能体生产线
  • 数据库--使用DQL命令查询数据(二)
  • 【FreeRTOS】创建一个任务的详细流程
  • CKA06--storageclass
  • 宝塔安装以及无法打开时的CA证书配置全攻略
  • wend看源码-Open_Deep_Research(LangChain)
  • 摄像头文档识别与透视变化技术和背景建模技术(追踪)
  • 123、【OS】【Nuttx】【周边】效果呈现方案解析:find 格式化打印
  • DC-4靶机渗透
  • 大模型在线对话平台集锦(持续更新ing...)
  • JavaScript中 i++ 与 ++i
  • 【cookie】JavaScript操作增删改查
  • OC-AFNetworking
  • Java全栈学习笔记35
  • kylin v10 系统 上 qt 5.15.17版本构建及使用
  • Linux:基于环形队列的生产者消费模型
  • Nginx 配置 Vue 项目 Hash/History 模式路由跳转错误的解决方案
  • Linux Makefile与进度条
  • 硬件驱动——I.MX6ULL裸机启动(3)(按键设置及中断设置
  • 深度学习基本模块:RNN 循环神经网络
  • 【深度学习】PixelShuffle处理操作
  • 10.1 - 遗传算法(旅行商问题C#求解)
  • Java 集合入门:从基础到实战的完整知识指南
  • 《过山车大亨3 完整版》PSXbox版下月推出 预告片赏
  • P1107题解
  • 多目标数据关联算法MATLAB实现