文件上传-第三方服务阿里云OSS

JAVA后端实现文件上传,比如图片上床功能,有很多实现方案,可以将图片保存到服务器的硬盘上。也可以建立分布式集群,专门的微服务来存储文件常见的技术比如Minio。对于中小型公司,并且上传文件私密性不高的话可以使用第三方的存储服务,比如阿里云、华为云等。

阿里云官网地址:对象存储 OSS_云存储服务_企业数据管理_存储-阿里云阿里云对象存储 OSS 是一款海量、安全、低成本、高可靠的云存储服务,提供 99.995 % 的服务可用性和多种存储类型,适用于数据湖存储,数据迁移,企业数据管理,数据处理等多种场景,可对接多种计算分析平台,直接进行数据处理与分析,打破数据孤岛,优化存储成本,提升业务价值。icon-default.png?t=N7T8https://www.aliyun.com/product/oss

一般入手第三方服务的学习,不要通读文档,可从官方的快速入门入手。将快速入门的代码粘一粘,看看哪些参数不应该写死应该抽取成工具类,哪些代码是核心的哪些代码可以省略,debug跑一下看看各个变量的值都是什么干什么用的

利用阿里云OSS来存储文件,首先要在管理控制台上Bucket列表中建立自己的存储空间Bucket,填写好自己的Bucjet名称、地域等信息。并且创建好AccessKey秘钥的id和密码,后续需要将Bucjet名称、地域、AccessKey秘钥的id和密码的信息写到配置yml文件中,在将其注入到SpringIOC容器中。

使用阿里云,Java代码编写前,pom.xml中导入aliyun-sdk-oss和aliyun-java-sdk-core依赖。

代码的核心就是通过区域、密匙等信息创建ossClinet客户端,上传文件根据储存地址转成输入流inputstream,调用ossClient.putObject方法,传入参数Bucket桶的名称、图片上传后的名称、图片输入流,就可完成图片上传功能

这种像图片上传的共用的功能,我们会抽取为工具类,供大家使用。

Bucjet名称、地域、AccessKey秘钥的id和密码等信息为方便后续修改,应将其写到配置文件中,通过创建配置类将其读取,在工具类中将其注入并通过@Import注解将其放到IOC容器中。

oss:
  key: 密匙id
  secret: 密匙密码,都为自己创建的,在官网创建时记得保存
  endpoint: oss-cn-beijing.aliyuncs.com 区域地址,上述为北京区域
  bucket: 桶名字
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "oss")//读取配置信息
public class OssProperties {
    private String key; //密匙id
    private String secret;//秘钥密码
    private String endpoint;//区域地址
    private String bucket;//桶名
}

一般都可以用@ConfigurationProperties这个注解来读取配置文件中的信息,使用@Value配合EL表达式也可做到读取配置文件中的信息,但是上述更为常见简单。

紧接着抽取工具类即可,工具类中注入OssProperties对象,上标注@Component与
@Import(OssProperties.class)注解

//阿里存储工具类
@Component
@Import(OssProperties.class)//导入,相当于将OssProperties对象放入容器
public class OssTemplate {

    @Autowired
    private OssProperties ossProperties;

    //文件上传
    public String upload(String fileName, InputStream inputStream) {
        //根据上面叙述的参数创建客户端
        OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(), ossProperties.getKey(), ossProperties.getSecret());

        //设置最终存储文件的路径和名称,自定义的,根据项目要求定义
        String objectName = "images/" + new SimpleDateFormat("yyyy/MM/dd").format(new Date())
                + "/" + System.currentTimeMillis() + fileName.substring(fileName.lastIndexOf("."));

        //meta设置请求头,解决访问图片地址直接下载
        ObjectMetadata meta = new ObjectMetadata();
        meta.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));

        //上传
        ossClient.putObject(ossProperties.getBucket(), objectName, inputStream, meta);

        //关闭客户端
        ossClient.shutdown();
        //可通过下述地址访问到图片,可将地址存储到数据库中
        return "https://" + ossProperties.getBucket() + "." + ossProperties.getEndpoint() + "/" + objectName;
    }

    //文件后缀处理,比如文件叫1.jpg,下述方法抽取取得就是.jpg
    private String getContentType(String FilenameExtension) {
        if (FilenameExtension.equalsIgnoreCase(".bmp")) {
            return "image/bmp";
        }
        if (FilenameExtension.equalsIgnoreCase(".gif")) {
            return "image/gif";
        }
        if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
                FilenameExtension.equalsIgnoreCase(".jpg") ||
                FilenameExtension.equalsIgnoreCase(".png")) {
            return "image/jpg";
        }
        return "image/jpg";
    }
}

官网快速入门中的截图:

图片上传大小默认是1M,太小了,需要修改,需修改配置文件

spring:
  servlet:
    multipart:
      max-request-size: 100MB # 最大请求文件大小,默认10MB
      max-file-size: 10MB # 单个请求文件大小,默认1MB

最后在应用代码中,写在controller层就可不必非写到service层,调用抽取的工具类ossTemplate.upload方法就可,注意参数接收文件类型为MultipartFile。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/387968.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【51单片机】一个简单的例子TMOD&TCON带你永远理解【(不)可位寻址】

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Linux》专栏YY的《数据…

【超级干货】ArcGIS_空间连接_工具详解

帮助里对空间连接的解释: 根据空间关系将一个要素的属性连接到另一个要素。 目标要素和来自连接要素的被连接属性写入到输出要素类。 如上图所示,关键在于空间关系,只有当两个要素存在空间关系的时候,空间连接才有用武之地。 一…

网站被劫持了怎么解决

网站被劫持是一种常见的网络安全问题,它通常表现为用户访问网站时被自动跳转到其他页面,这不仅影响用户体验,还可能对网站带来负面影响。面对这种情况,如何运用高技术手段来有效应对和防范网站劫持,成为了一个迫切需要…

【Linux学习】线程池

目录 23.线程池 23.1 什么是线程池 23.2 为什么需要线程池 23.3 线程池的应用场景 23.4 实现一个简单的线程池 23.4.1 RAII风格信号锁 23.4.2 线程的封装 23.4.3 日志打印 22.4.4 定义队列中存放Task类任务 23.4.5 线程池的实现(懒汉模式) 为什么线程池中需要有互斥锁和条件变…

MySQL学习记录——구 复合查询

文章目录 1、基本查询2、多表查询3、自连接4、子查询1、多行子查询2、多列子查询3、from句中的子查询 5、合并查询 1、基本查询 看一些例子,不关心具体内容,只看写法 //查询工资高于500或岗位为MANAGER的雇员, 同时还要满足他们的姓名首字母为大写的J …

Java图形化界面编程——AWT概论 笔记

2.3 Container容器 2.3.1 Container继承体系 Winow是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局;Panel可以容纳其他组件,但不能独立存在,它必须内嵌其他容器中使用,默认使用FlowLayout管理其内部组件布局;S…

DOM事件练习1

DOM事件练习1 1. 演示效果 2. 分析思路 用 ul 创建四个 li 列表整个列表的背景是红色的,鼠标悬浮在列表上,一行的变为蓝色点击任意列表,整个列表的背景变为白色,被点击的列表变为粉色需要用到 js 的点击事onclick件和forEach循环…

【并发编程】ThreadPoolExecutor类

📝个人主页:五敷有你 🔥系列专栏:并发编程⛺️稳重求进,晒太阳 ThreadPoolExecutor 1) 线程池状态 ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量 状态名 高三位 …

网络安全威胁,如何解决缓冲区溢出攻击

目录 一、什么是网络安全 二、什么是缓冲区 三、缓冲区溢出 四、缓冲区溢出攻击的类型 一、什么是网络安全 网络安全(Network Security)指的是保护计算机网络及其相关设备、系统和数据免受未经授权访问、破坏、篡改、窃取或滥用的威胁和攻击。随着网…

【C语言必刷题】1.打印1~100之间的奇数

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

[职场] 应聘销售的简历怎么写 #职场发展#笔记

应聘销售的简历怎么写 应聘销售的简历怎么写1 基本信息 姓名:吴x 性别:女 毕业院校:徐州师范大学计算机科学院 学历:大专 联系电话:电子邮件: 工作经验:4年 求职意向 期望从事职业:销…

前端秘法基础式(HTML)(第二卷)

目录 一.表单标签 1.表单域 2.表单控件 2.1input标签 2.2label/select/textarea标签 2.3无语义标签 三.特殊字符 一.表单标签 用来完成与用户的交互,例如登录系统 1.表单域 <form>通过action属性,将用户填写的数据转交给服务器 2.表单控件 2.1input标签 type…

(03)Hive的相关概念——分区表、分桶表

目录 一、Hive分区表 1.1 分区表的概念 1.2 分区表的创建 1.3 分区表数据加载及查询 1.3.1 静态分区 1.3.2 动态分区 1.4 分区表的本质及使用 1.5 分区表的注意事项 1.6 多重分区表 二、Hive分桶表 2.1 分桶表的概念 2.2 分桶表的创建 2.3 分桶表的数据加载 2.4 …

UART通信中的奇偶校验

UART通信中的奇偶校验&#xff1a;提升数据传输可靠性的简单方法 在微控制器&#xff08;MCU&#xff09;和各种电子设备之间的数据通信领域&#xff0c;UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发传输器&#xff09;协议是一种广泛…

23款奔驰S400商务版没有后排电动座椅那改装一套跟选装有区别吗

改装的后排电动座椅通常提供以下功能&#xff1a; 电动调节&#xff1a;座椅可以通过按钮或控制面板进行前后调节&#xff0c;以适应乘客的腿部空间需求。 靠背角度调节&#xff1a;乘客可以通过电动调节功能来调整座椅的靠背角度&#xff0c;以获得更舒适的坐姿。 座椅倾斜调…

投资银行在网络安全生态中的作用

文章目录 一、投资银行的含义(一)并购买方。(二)并购卖方。(三)IPO辅助。(四)投资银行业务的另一方面是帮助这些交易融资。二、从投资银行角度看网络安全产业(一)行业的短期前景三、复杂的网络安全并购(一)行业知识对投资银行业务很重要(二)在网络安全领域,技术…

嵌入式C语言学习——基于Linux与GCC(二)

系列文章目录 一.C语言常用关键字及运算符操作 文章目录 系列文章目录内存四区指针指针概述指针 修饰符constvoliatiletypedef 指针运算符多级指针 数组数组空间字符空间及地址 结构体、共用体定义、字节对齐位域 内存分布图段错误分析 内存四区 C/C语言的内存四区&#xff…

MySQL 基础知识(六)之数据查询(一)

目录 1 基本查询 1.1 查询相关列 (select * / 列名) 1.2 别名 (as) 1.3 去重 (distinct) 1.4 对列中的数据进行运算 (、-、*、/) 2 条件查询 (where) 2.1 等值查询 () 2.2 非等值查询 (>、<、>、<、!、><) 2.3 逻辑判断 (and、or、not) 2.4 区间判…

Shell 学习笔记(一)-Shell脚本编程简介

一 什么是shell&#xff1f; shell是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内…

rocketMQ下载、安装及配置

topic主题 - 里边存在多个队列&#xff08;队列是真实存在的&#xff09; rocketMQ安装及配置 一、官网下载 windows和linux系统版本都一样。Binary 下载 下载 | RocketMQ (apache.org) 二、修改运行内存及broker.conf、配置环境变量 1、修改根目录->bin目录下runserve…