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

SpringBoot实现文件上传和下载

// 文件上传和下载 multipartfile byte数组获取比特流 @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return "Please select a file to upload."; } try { byte[] bytes = file.getBytes(); String uploadDir = "D:\\project\\wms\\web002-main\\wms001\\file_upload_download\\"; File uploadedFile = new File(uploadDir + file.getOriginalFilename()); file.transferTo(uploadedFile); return "File uploaded successfully!"; } catch (IOException e) { e.printStackTrace(); return "File upload failed!"; } } // 上传/下载的根目录(建议和上传接口保持一致,可从配置文件注入) private static final String UPLOAD_DIR = "D:\\project\\wms\\web002-main\\wms001\\file_upload_download\\"; /** * 文件下载接口 * @param fileName 要下载的文件名(前端传入,需和上传时的文件名一致) * @return 响应体(包含文件流) */ @GetMapping("/download") public ResponseEntity<byte[]> downloadFile(@RequestParam("fileName") String fileName) { // 1. 构建要下载的文件完整路径 File downloadFile = new File(UPLOAD_DIR, fileName); // 2. 校验文件是否存在 if (!downloadFile.exists()) { // 返回 404 状态码 + 提示信息 return ResponseEntity.status(HttpStatus.NOT_FOUND) .body(("文件不存在:" + fileName .getBytes(StandardCharsets.UTF_8)).getBytes()); } // 3. 读取文件字节流 try (InputStream inputStream = new FileInputStream(downloadFile)) { // 读取文件到字节数组 byte[] fileBytes = new byte[(int) downloadFile.length()]; inputStream.read(fileBytes); // 4. 设置响应头(关键:处理中文文件名、指定下载类型) HttpHeaders headers = new HttpHeaders(); // 处理中文文件名乱码(URLEncoder 编码) String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8).replace("+", "%20"); // 设置响应头:指定文件下载方式、文件名 headers.add("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\""); // 设置响应媒体类型(二进制流,支持所有文件类型) headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); // 设置文件大小 headers.setContentLength(fileBytes.length); // 5. 返回响应(200 成功 + 响应头 + 文件字节流) return new ResponseEntity<>(fileBytes, headers, HttpStatus.OK); } catch (IOException e) { e.printStackTrace(); // 返回 500 状态码 + 错误信息 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(("文件读取失败:" + e.getMessage()).getBytes(StandardCharsets.UTF_8)); } }

yml配置

server: port: 8090 spring: datasource: url: jdbc:mysql://localhost:3306/wms driver-class-name: com.mysql.cj.jdbc.Driver username: root password: 123456 servlet: multipart: max-file-size: 10MB # 单个文件的最大大小 max-request-size: 10MB # 单次请求的总文件大小上限
http://www.jsqmd.com/news/497589/

相关文章:

  • 上海小程序定制公司推荐:如何避开低价陷阱选对家
  • 2026农机橡塑配件推荐榜:排种器/排种盒/排种管/播种机塑料件/播种机尼龙件/播种机有机肥排肥装置/播种机有机肥施肥装置/选择指南 - 优质品牌商家
  • 大模型AI-入门-发展历程-机器学习
  • 上海新锐品牌Lifenias:用酸枣百合滴鸡精拯救睡眠 - 中媒介
  • 测试结果验证测试:无限递归的俄罗斯套娃
  • 链表_必会面试题2
  • 数据库安全最后一公里:金仓SQL防火墙如何填平开发留下的注入坑
  • 1391、STM32单片机智能语音识别分类垃圾桶 超声波检测溢满报警 语音播报垃圾分类(程序+原理图+PCB文件+proteus仿真+参考论文+开题报告+原理图文字讲解+程序流程图+硬件框图+器件清单
  • 「龙虾」来了!OpenClaw如何掀起AI智能体革命
  • 东华复试day17
  • 挺黑色幽默的笑话
  • python-flask导师选择分配管理系统 _0spy6
  • 基于LangChain的RAG与Agent智能体开发 - OpenAI库介绍和使用
  • 四川大学团队破解“万能图像修复“难题
  • AOP相关面试题
  • 提示系统SQL优化从慢到快:架构师用提示工程实现查询响应速度提升10倍
  • 英集芯IP2391N支持低功耗Boost充电的微光能量收集芯片
  • PCB抄板技术全流程解析
  • 如何在Dev-C++中设置临时环境变量?
  • 【码道初阶-Hot100】LeetCode 438 + 567 对照详解:一套滑动窗口模板,彻底讲透“固定长度窗口 + 计数数组 + count维护”
  • 基于「YOLO目标检测 + 多模态AI分析」的热轧钢带表面缺陷检测分析系统
  • 24大数据 R语言代码合集
  • 爬虫对抗实战 - ZLibrary反爬机制分析与突破
  • Spring Boot 配置文件优先级机制
  • intel wifi AX200停用,无线连接都不能用。
  • 【第7篇】Mamba 100篇合集 · 从入门到天花板
  • SQL SERVER 登陆错误:18456
  • 虚拟实验室:物理化学实验的计算机模拟
  • 图的领接矩阵表示法
  • 软件文档管理中的权限控制机制