基于SpringBoot上传任意文件功能的实现

发布时间 - 2026-01-11 02:36:04    点击率:

一、pom文件依赖的添加

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
  </dependencies>

二、controller层

@Controller
public class FileUploadController {
  private final StorageService storageService;

  @Autowired
  public FileUploadController(StorageService storageService) {
    this.storageService = storageService;
  }

  //展示上传过的文件
  @GetMapping("/")
  public String listUploadedFiles(Model model) throws IOException {

    model.addAttribute("files", storageService.loadAll().map(path ->
            MvcUriComponentsBuilder.fromMethodName(FileUploadController.class, "serveFile", path.getFileName().toString())
            .build().toString())
        .collect(Collectors.toList()));

    return "uploadForm";
  }

  //下载选定的上传的文件
  @GetMapping("/files/{filename:.+}")
  @ResponseBody
  public ResponseEntity<Resource> serveFile(@PathVariable String filename) {

    Resource file = storageService.loadAsResource(filename);
    return ResponseEntity
        .ok()
        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+file.getFilename()+"\"")
        .body(file);
  }

  //上传文件
  @PostMapping("/")
  public String handleFileUpload(@RequestParam("file") MultipartFile file,
                  RedirectAttributes redirectAttributes) {

    storageService.store(file);
    redirectAttributes.addFlashAttribute("message",
        "You successfully uploaded " + file.getOriginalFilename() + "!");

    return "redirect:/";
  }

  @ExceptionHandler(StorageFileNotFoundException.class)
  public ResponseEntity<?> handleStorageFileNotFound(StorageFileNotFoundException exc) {
    return ResponseEntity.notFound().build();
  }
}

三、实现的service层

@Service
public class FileSystemStorageService implements StorageService {

  private final Path rootLocation;

  @Autowired
  public FileSystemStorageService(StorageProperties properties) {
    this.rootLocation = Paths.get(properties.getLocation());
  }

  @Override
  public void store(MultipartFile file) {
    try {
      if (file.isEmpty()) {
        throw new StorageException("Failed to store empty file " + file.getOriginalFilename());
      }
      Files.copy(file.getInputStream(), this.rootLocation.resolve(file.getOriginalFilename()));
    } catch (IOException e) {
      throw new StorageException("Failed to store file " + file.getOriginalFilename(), e);
    }
  }

  @Override
  public Stream<Path> loadAll() {
    try {
      return Files.walk(this.rootLocation, 1)
          .filter(path -> !path.equals(this.rootLocation))
          .map(path -> this.rootLocation.relativize(path));
    } catch (IOException e) {
      throw new StorageException("Failed to read stored files", e);
    }

  }

  @Override
  public Path load(String filename) {
    return rootLocation.resolve(filename);
  }

  @Override
  public Resource loadAsResource(String filename) {
    try {
      Path file = load(filename);
      Resource resource = new UrlResource(file.toUri());
      if(resource.exists() || resource.isReadable()) {
        return resource;
      }
      else {
        throw new StorageFileNotFoundException("Could not read file: " + filename);

      }
    } catch (MalformedURLException e) {
      throw new StorageFileNotFoundException("Could not read file: " + filename, e);
    }
  }

  @Override
  public void deleteAll() {
    FileSystemUtils.deleteRecursively(rootLocation.toFile());
  }

  @Override
  public void init() {
    try {
      Files.createDirectory(rootLocation);
    } catch (IOException e) {
      throw new StorageException("Could not initialize storage", e);
    }
  }
}

四、在application.properties文件上配置上传的属性

spring.http.multipart.max-file-size=128KB
spring.http.multipart.max-request-size=128KB

五、服务启动时的处理

六、测试成功的结果

以上这篇基于SpringBoot上传任意文件功能的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# SpringBoot上传任意文件  # 详解SpringBoot文件上传下载和多文件上传(图文)  # springboot实现文件上传和下载功能  # SpringBoot实现文件上传下载功能小结  # springboot 文件上传大小配置的方法  # SpringBoot限制文件或图片上传大小的两种配置方法  # SpringBoot文件上传控制及Java 获取和判断文件头信息  # 全面解析SpringBoot文件上传功能  # Springboot上传excel并将表格数据导入或更新mySql数据库的过程  # SpringBoot 文件上传和下载的实现源码  # SpringBoot+fileUpload获取文件上传进度  # 上传  # 给大家  # 希望能  # 这篇  # 小编  # 启动时  # 大家多多  # 上传文件  # fromMethodName  # serveFile  # MvcUriComponentsBuilder  # path  # build  # collect  # getFileName  # toString  # map  # model  # throws  # listUploadedFiles 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  教学论文网站制作软件有哪些,写论文用什么软件 ?  Python结构化数据采集_字段抽取解析【教程】  如何在VPS电脑上快速搭建网站?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Laravel如何实现一对一模型关联?(Eloquent示例)  IOS倒计时设置UIButton标题title的抖动问题  创业网站制作流程,创业网站可靠吗?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  C#如何调用原生C++ COM对象详解  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Java垃圾回收器的方法和原理总结  如何快速上传建站程序避免常见错误?  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  黑客入侵网站服务器的常见手法有哪些?  使用Dockerfile构建java web环境  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  php 三元运算符实例详细介绍  韩国服务器如何优化跨境访问实现高效连接?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  如何快速查询网址的建站时间与历史轨迹?  如何在云主机上快速搭建多站点网站?  利用python获取某年中每个月的第一天和最后一天  js实现点击每个li节点,都弹出其文本值及修改  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  详解jQuery中的事件  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  ,南京靠谱的征婚网站?  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  如何在建站宝盒中设置产品搜索功能?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  大连 网站制作,大连天途有线官网?  如何挑选高效建站主机与优质域名?  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  iOS UIView常见属性方法小结  如何在云服务器上快速搭建个人网站?  如何快速辨别茅台真假?关键步骤解析