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

Spring开发系统时如何实现上传和下载文件

代码如下

值得注意的是上传时候不需要参数servletRequest而下载时候却需要servletResponse,这是为什么呢?

这是因为文件上传时,客户端通过 HTTP POST 请求将文件数据放在 请求体(Body) 中。Spring MVC 对上传过程进行了高度封装,开发者无需直接操作 HttpServletRequest:

  • 框架自动解析:当请求的 Content-Type 为 multipart/form-data 时,Spring 会自动解析请求体,并将文件内容封装为 MultipartFile 对象。

  • 简化参数绑定:通过 @RequestParam(“file”) MultipartFile file 即可直接获取文件对象,无需手动从 HttpServletRequest 中提取数据。

那为什么需要servletResponse呢?

  • 因为文件内容需要直接写入响应输出流,而 Spring 的 @ResponseBody 或 ResponseEntity 适用于结构化数据(如 JSON),不适合大文件流式传输。
package com.xxx.xxxxx.controller;import com.xxx.xxxxx.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.UUID;/*** 文件上传和下载*/
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {// 这个在application.yml里配置@Value("${reggie.path}")private String basePath;/*** 文件上传* @param file* @return*/@PostMapping("/upload")public httpResp<String> upload(@RequestParam("file") MultipartFile file){// file是一个临时文件,需要转存到指定位置,否则本次请求完成后临时文件会删除log.info(file.toString());//原始文件名String originalFilename = file.getOriginalFilename();//abc.jpgString suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//使用UUID重新生成文件名,防止文件名称重复造成文件覆盖String fileName = UUID.randomUUID().toString() + suffix;//dfsdfdfd.jpg//创建一个目录对象File dir = new File(basePath);//判断当前目录是否存在if(!dir.exists()){//目录不存在,需要创建dir.mkdirs();}try {// 将临时文件转存到指定位置file.transferTo(new File(basePath + fileName));} catch (IOException e) {e.printStackTrace();}return httpResp.success(fileName);}/*** 文件下载* @param name* @param response*/@GetMapping("/download")public void download(String name, HttpServletResponse response){try {//输入流,通过输入流读取文件内容FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));//输出流,通过输出流将文件写回浏览器,因为我们要把文件返还回去,所以要ServletResponseServletOutputStream outputStream = response.getOutputStream();response.setContentType("image/jpeg");int len = 0;byte[] bytes = new byte[1024];while ((len = fileInputStream.read(bytes)) != -1){outputStream.write(bytes,0,len);outputStream.flush();}//关闭资源outputStream.close();fileInputStream.close();} catch (Exception e) {e.printStackTrace();}}
}

相关文章:

  • Redis 的速度为什么这么快
  • 行列视的产品目标
  • 【Android】屏幕适配小合集
  • 【sylar-webserver】9 网络模块
  • git merge解冲突后,add、continue提交
  • 物联网、云计算技术加持,助推楼宇自控系统实现智能高效管理
  • Git实战演练,模拟日常使用,快速掌握命令
  • Vue 3.0中异步组件defineAsyncComponent
  • 前端 git仓库
  • 深入学习和对比Python 列表与元组
  • Win 系统 conda 如何配置镜像源
  • 为 Scade 6 编译器提供形式化认证工具的考虑 (2010)
  • LCI输出频率配置方法
  • Vue.js教学第十章:自定义命令的创建使用与应用
  • Android-RecyclerView学习总结
  • 新疆工程系列建筑专业职称评审条件
  • 流程引擎选型指南
  • zabbix 常见问题
  • 繁体字与简体中文转换
  • 基于springboot+vue的人口老龄化社区服务与管理平台(源码+数据库+文档)
  • 上海企业100强名单/网站seo服务商
  • 大航母网站建设/品牌策划是做什么的
  • 公司网站制作平台/友情链接模板
  • 网站源码什么意思/广告平台网
  • 汕头百姓网交友/seo网站优化
  • 企业网站做多大/东营网站建设费用