本文讲解 Spring Boot 文件上传下载包括 Multipart、分片上传、断点续传、秒传、限制配置和阿里云 OSS 集成。正文1. 基础上传java复制下载PostMapping(/upload) public ResultString upload(RequestParam(file) MultipartFile file) throws IOException { String filename UUID.randomUUID() _ file.getOriginalFilename(); Path target Path.of(/data/upload, filename); Files.createDirectories(target.getParent()); file.transferTo(target); return Result.success(filename); }2. 配置限制yaml复制下载spring: servlet: multipart: max-file-size: 100MB max-request-size: 200MB enabled: true3. 下载java复制下载GetMapping(/download/{name}) public ResponseEntityResource download(PathVariable String name) { Path path Path.of(/data/upload, name); Resource resource new FileSystemResource(path); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, attachment; filename\ name \) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(resource); }4. 分片上传前端将文件切成固定大小分片逐片上传。java复制下载PostMapping(/chunk) public ResultVoid uploadChunk( RequestParam String fileId, RequestParam int chunkIndex, RequestParam MultipartFile chunk) throws IOException { Path dir Path.of(/data/chunks, fileId); Files.createDirectories(dir); chunk.transferTo(dir.resolve(String.valueOf(chunkIndex))); return Result.success(null); } PostMapping(/merge) public ResultString merge(RequestParam String fileId, RequestParam int total, RequestParam String filename) throws IOException { Path dir Path.of(/data/chunks, fileId); Path target Path.of(/data/upload, filename); try (OutputStream out Files.newOutputStream(target)) { for (int i 0; i total; i) { Files.copy(dir.resolve(String.valueOf(i)), out); } } deleteDir(dir); return Result.success(filename); }5. 断点续传上传前查询已上传分片java复制下载GetMapping(/chunks/{fileId}) public ResultListInteger uploadedChunks(PathVariable String fileId) throws IOException { Path dir Path.of(/data/chunks, fileId); if (!Files.exists(dir)) return Result.success(List.of()); try (StreamPath stream Files.list(dir)) { ListInteger list stream .map(p - Integer.parseInt(p.getFileName().toString())) .sorted() .toList(); return Result.success(list); } }前端跳过已上传分片。6. 秒传基于文件 MD5 判断是否已存在java复制下载PostMapping(/check) public ResultString check(RequestParam String md5) { String existing fileHashService.findByMd5(md5); return Result.success(existing); }7. 阿里云 OSS 集成xml复制下载运行dependency groupIdcom.aliyun.oss/groupId artifactIdaliyun-sdk-oss/artifactId version3.17.4/version /dependencyjava复制下载OSS ossClient new OSSClientBuilder().build(endpoint, ak, sk); ossClient.putObject(bucket, key, inputStream); String url https:// bucket . endpoint / key;分片上传用MultipartUpload。8. 安全考虑文件类型白名单。文件大小限制。文件名防路径穿越。存储目录不可执行。病毒扫描。9. 常见坑大文件内存溢出。临时文件未清理。并发上传同名文件冲突。OSS 签名过期。10. 总结文件上传下载要处理大文件、分片、断点续传和秒传。生产建议直接使用 OSS/S3本地只做转发和校验
企业数字化 ERP 产品动态
相关推荐
一个.class文件是怎么被JVM跑起来的?类加载机制+双亲委派一篇讲透 一个 .class 文件是怎么被 JVM 跑起来的?类加载机制 双亲委派一篇讲透
你写的 Java 代码编译成 .class 之后,JVM 到底对它做了什么,才能让它真正跑起来?
为什么静态代码块只执行一次?为什么你自己写一个 java.lang.St… · 2026/9/25 20:26:50
图像处理标准测试图全指南:Lena、cameraman获取与加载方法 刚入行做图像处理的同学,十有八九都经历过这么一幕:导师或者教程里让“用Lena图跑一下高斯滤波”“拿cameraman测一下边缘检测”,结果你打开搜索引擎,翻半天找到的图片要么带水印、要么尺寸不对、要么干脆是博主自己拍的某个二次元… · 2026/9/25 20:26:38
Atlas 300V部署YOLO实战:从模型转换到推理加速全流程 1. 项目概述:Atlas到底是何方神圣先说结论:当你看到“atlas”这个词出现在AI硬件语境里,几乎可以默认它指的是华为昇腾(Ascend)系列的AI计算平台。从加速卡到服务器整机再到边缘计算盒子,Atlas是整个产品线… · 2026/9/25 20:26:38
Atlas 300V推理加速卡上的YOLO部署实践:从模型转换到性能调优 Atlas 上的 YOLO 部署指南:从硬件认知到推理落地最近后台一直有朋友在问 Atlas 300V 24G 到底是不是运算加速卡,又要怎么在它上面跑 YOLO。这批问题特别集中,今天干脆把这块卡和整套部署流程一次说清楚。Atlas 300V 24G 是运算加速卡… · 2026/9/25 20:51:21
DB-GPT V0.6.1 版本更新:RAG 能力更强,新增 RAG 召回和 Agent 答案评测功能 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 20:51:08
从Excel到自研桌面型CRM:客户沟通与跟进管理实践 1. 为什么我会做 DeskcommCRM,而不是继续用 Excel 表格先交代背景。我手上同时管着三块业务:电话销售、售后客服、以及零零散散的渠道伙伴对接。之前最头疼的不是没工具,而是工具太多太散——客户信息存在 Excel 里,通话记录在话务… · 2026/9/25 20:51:08
Linux 7.4内核HDMI全面升级:FreeSync VRR与ALLM原理及实践指南 如果你还停留在“Linux下插HDMI只要屏幕能亮就算成功”的阶段,那么Linux 7.4内核这次在HDMI功能上的全面升级,很可能会刷新你对Linux桌面显示体验的认知。新增的FreeSync VRR(可变刷新率)与自动低延迟模式(ALLM&#x… · 2026/9/25 20:51:02
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37