[java后端研发]——文件上传与下载(2种方式)

简介: [java后端研发]——文件上传与下载(2种方式)

🌈键盘敲烂,年薪30万🌈



前言:

文件上传在后端开发中经常用到,例如显示一张图片,就需要我们后端保存图片文件,然后将图片文件回显给浏览器。

  • 对于图片文件来说就俩个步骤:

1. 接收上传的图片保存起来 ->本地 或 云服务器

2. 回显图片给浏览器 -> 返回本地文件路径 或 云服务器的文件路径

  • 服务器处理图片的两种方式:

①保存在服务器本地的磁盘中

②交给云服务器存储,例如阿里云OSS

  • 注意:

每次请求时,服务器会将文件临时保存在一个地方,请求结束时,临时文件会被删除,所以才要把上传的文件下载到本地或云端。

  • 认识MultipartFile类:

spring框架封装好了用于前后端传输文件的类 -> MultipartFile,前端页面必须有一个type为MultipartFile的From表单,当前端发送请求到后端时,我们后端只需用一个MultipartFile类的对象就可以接收这个文件参数。下面就说一下两种文件存储方式。

一、本地存储

①文件上传到本地:

注意:

保存的路径可以在配置文件里设置

保存的文件名要用UUID生成,防止文件覆盖

    //保存到本地
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws Exception {
        //要保存的路径
        String basePath = "D:\\image";
        //file是一个临时文件,当请求结束时,临时文件会删除
        // 先判断转存路径的文件夹有没有
        File dir = new File(basePath);
        if(!dir.exists()){
            dir.mkdirs();
        }
 
        //这里有两个地方要改
        //1.文件路径要写在配置文件里面
        //2.文件名要用UUID生成
        // 获取源文件名 xxxx.jpg
        String originalFilename = file.getOriginalFilename();
        // 获取后缀 .jpg
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 使用UUID重新生成文件名
        String fileName = UUID.randomUUID().toString() + suffix;
        file.transferTo(new File(basePath + fileName));
 
        return R.success(fileName);
    }

②文件下载到浏览器:

注意:

用输出流从服务器本地向浏览器输出数据

        //文件下载到浏览器
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException {
        //从服务器读取文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(basePath + name));
        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
 
        response.setContentType("image/jpeg");
 
        int len = 0;
        byte[] bytes = new byte[1204];
        while( (len = bis.read(bytes)) != -1 ){
            bos.write(bytes, 0, len);
            bos.flush();
        }
        bos.close();
        bis.close();
 
    }

二、云存储(阿里云OSS):

①文件上传到阿里云:

注意:

需要导入阿里OSS的相关包,使用putObject方法以流的方式写道云服务器。

    public String upload(MultipartFile file) throws IOException, ClientException {
 
        String endpoint = propertiesUtils.getEndpoint();
        String bucketName = propertiesUtils.getBucketName();
 
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider=CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
 
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();
 
        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
        ossClient.putObject(bucketName, fileName, inputStream);
 
        //文件访问路径
        String url = "https://" + bucketName + "." + endpoint + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

②将阿里云的图片路径返回给数据库:

存储到阿里云中的图片直接赋值路径从浏览器就能打开,所以直接在数据库中创建一个字段存储图片的url即可回显图片。

📕总结

  • 本地存储不安全,数据一旦丢失,维护成本高。通过transerForTo方法转存到本地服务器。
  • 云存储通过阿里OSS工具类提供的putObject方法,将文件保存到阿里云OSS服务器。
相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
10月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
623 6
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
812 0
|
设计模式 算法 Java
2025 春季校招 Java 研发笔试题详细解析及高效学习指南
本指南专为2025春季校招Java研发岗位笔试设计,涵盖Java 17+新特性(如模式匹配、文本块、记录类和密封类)、现代技术栈(Spring Boot 3、响应式编程、Stream API增强)以及算法与数据结构实战。同时深入解析Spring Data JPA、事务管理、性能优化等内容,并结合实际案例讲解常见算法题解与设计模式应用。资源包含核心知识点、面试题及笔试技巧,助力高效备考。下载地址:[链接](https://pan.quark.cn/s/14fcf913bae6)。
336 1
|
存储 算法 NoSQL
2025 春季校招 java 研发岗位笔试题及相关内容
这份指南针对2025春季校招Java研发岗位,系统梳理了笔试核心知识点。内容涵盖Java基础(关键字、数据类型、循环与条件判断)、集合框架(List、Set、Map)、多线程(创建、同步、休眠与等待)以及异常处理(类型与机制)。通过典型例题解析与实践指导,帮助求职者掌握解题思路,提升编程能力,为成功通过校招笔试奠定基础。资源链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)
379 0
|
存储 安全 算法
Java 集合面试题 PDF 下载及高频考点解析
本文围绕Java集合面试题展开,详细解析了集合框架的基本概念、常见集合类的特点与应用场景。内容涵盖`ArrayList`与`LinkedList`的区别、`HashSet`与`TreeSet`的对比、`HashMap`与`ConcurrentHashMap`的线程安全性分析等。通过技术方案与应用实例,帮助读者深入理解集合类的特性和使用场景,提升解决实际开发问题的能力。文末附带资源链接,供进一步学习参考。
352 4
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
780 70
|
JavaScript Java Docker
干货含源码!如何用Java后端操作Docker(命令行篇)
只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
Java API Docker
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
|
监控 前端开发 Java
构建高效Java后端与前端交互的定时任务调度系统
通过以上步骤,我们构建了一个高效的Java后端与前端交互的定时任务调度系统。该系统使用Spring Boot作为后端框架,Quartz作为任务调度器,并通过前端界面实现用户交互。此系统可以应用于各种需要定时任务调度的业务场景,如数据同步、报告生成和系统监控等。
894 9
|
Linux 网络安全 Docker
尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
尼恩提供了一系列文章,旨在帮助开发者轻松搭建一键开发环境,涵盖Java分布式、高并发场景下的多种技术组件安装与配置。内容包括但不限于Windows和CentOS虚拟机的安装与排坑指南、MySQL、Kafka、Redis、Zookeeper等关键组件在Linux环境下的部署教程,并附带详细的视频指导。此外,还特别介绍了Vagrant这一虚拟环境部署工具,
尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)

热门文章

最新文章