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

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: [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服务器。
相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
48 3
|
17天前
|
小程序 前端开发 算法
|
1月前
|
NoSQL 安全 Java
Java后端基础自测
Java后端基础自测
60 12
|
1月前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
【10月更文挑战第8天】本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
35 5
|
1月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
19 1
|
1月前
|
算法 Java Linux
java制作海报五:java 后端整合 echarts 画出 折线图,项目放在linux上,echarts图上不显示中文,显示方框口口口
这篇文章介绍了如何在Java后端整合ECharts库来绘制折线图,并讨论了在Linux环境下ECharts图表中文显示问题。
39 1
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
105 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
10天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
6天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
25 9
|
9天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####

热门文章

最新文章