阿里云OSS实现图片上传(后端接口)

news2024/12/24 8:39:32

文章目录

  • 1、阿里云oss服务开通
  • 2、java操作阿里云oss,上传文件到阿里云oss
    • 1. 创建操作阿里云oss许可证
    • 2. 安装SDK
    • 3.修改配置文件
    • 4.创建常量类,读取配置文件中的内容
    • 5、OssController
    • 6、OssService
    • 7、OssServiceImpl
    • 8、改进
      • 1. 多次上传相同名称文件,会造成最后一次上传把之前上传文件覆盖
      • 2. 把文件进行分类管理

1、阿里云oss服务开通

去阿里云官网开通“对象存储OSS”服务
在这里插入图片描述
点击免费试用:
在这里插入图片描述
点击立即试用即可
在这里插入图片描述

  1. 进入管理控制台
    在这里插入图片描述

    (1). 使用oss,创建bucket
    在这里插入图片描述
    (2)
    在这里插入图片描述
    在这里插入图片描述
    完成创建

2、java操作阿里云oss,上传文件到阿里云oss

1. 创建操作阿里云oss许可证

在这里插入图片描述
在这里插入图片描述
新建的子用户AccessKey配置相应的管理对象存储服务(OSS)权限。
在这里插入图片描述
不加的话,会报com.aliyun.oss.OSSException: You have no right to access this object because of bucket acl.别问我是怎么知道的呜呜呜

将创建出的AccessKeyId和AccessKeySecret导出并保存到本地,方便以后使用

2. 安装SDK

在Maven工程中使用OSS Java SDK,只需在pom.xml中加入相应依赖即可。以3.15.1版本为例,在中加入如下内容:

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.1.0</version>
</dependency>

 <dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <optional>true</optional>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.18</version>
</dependency>

3.修改配置文件

将endpoint及下面的配置写入你自己的

aliyun:
  oss:
    file:
      endpoint: 
      keyid: 
      keysecret:
#        bucket可以由控制台创建,也可以使用java代码创建
      bucketname:

有可能你的OSS放在一个单独的子模块中,该子模块只做上传到OSS这一个功能,以至于启动类在启动时,去找数据库配置,由于找不到数据库配置,会报错。

解决方法是在启动类添加属性,默认不去加载数据库配置,如下:
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

还需要设置文件上传最大限制,因为springboot对文件上传有默认最大限制,即最大可支持1MB的文件大小,在单个请求中最多可容纳10Mb的文件数据。当你传输的文件大于1MB,就会报👇

The field file exceeds its maximum permitted size of 1048576 bytes.

Spring Boot 2.0版本及以上,配置如下:具体设置文件上限大小就依你们实际需求而定,我只是举个例子

spring:
  application:
    name: service
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

4.创建常量类,读取配置文件中的内容

@Component
public class ConstantPropertiesUtil implements InitializingBean {
//    读取配置文件内容

    @Value("${aliyun.oss.file.endpoint}")
    private String endpoint;

    @Value("${aliyun.oss.file.keyid}")
    private String keyId;

    @Value("${aliyun.oss.file.keysecret}")
    private String keySecret;

    @Value("${aliyun.oss.file.bucketname}")
    private String bucketName;

    public static String END_POINT;

    public static String KEY_ID;

    public static String KEY_SECRET;

    public static String BUCKET_NAME;

    @Override
    public void afterPropertiesSet() throws Exception {
        END_POINT = endpoint;

        KEY_ID = keyId;

        KEY_SECRET = keySecret;

        BUCKET_NAME = bucketName;
    }
}

由于实现了InitializingBean这个接口,当读取完配置文件中的数据后,就会调用afterPropertiesSet方法,将属性暴露出去,供其他类使用

5、OssController

@RestController
@RequestMapping("/oss/fileoss")
public class OssController {

    @Autowired
    private OssService ossService;

    @PostMapping
    public ResultUtil uploadOssFile(@RequestBody MultipartFile file){

        /**返回上传到oss的路径*/
        String url = ossService.uploadFileAvatar(file);

        return ResultUtil.success(url);
    }
}
@Data
public class ResultUtil {

    private String code;

    private String message;

    private  Object data;
    public static  ResultUtil success(Object data){
        ResultUtil resultUtil = new ResultUtil();
        resultUtil.setCode("200");
        resultUtil.setMessage("请求成功");
        resultUtil.setData(data);
        return resultUtil;
    }
}


6、OssService

public interface OssService {
    /**上传头像到oss*/
    String uploadFileAvatar(MultipartFile multipartFile);
}

7、OssServiceImpl

@Service
public class OssServiceImpl implements OssService {


    @Override
    public String uploadFileAvatar(MultipartFile multipartFile) {

        String endpoint = ConstantPropertiesUtil.END_POINT;
        String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
        // 填写Bucket名称
        String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
        /** 创建OSSClient实例。*/
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
       try {
            

           /** 获取上传文件输入流*/
           InputStream inputStream = multipartFile.getInputStream();

           /**获取文件名称*/
           String filename = multipartFile.getOriginalFilename();

           /**调用oss方法实现上传*/
           //第一个参数 Bucket名称
           //第二个参数 上传到oss文件路径或文件名称
           //第三个参数 上传文件输入流
           ossClient.putObject(bucketName, filename, inputStream);

           /** 返回上传到阿里OSS的路径*/
           String url = "https://".concat(bucketName).concat(".").concat(endpoint).concat("/").concat(filename);

           return url;
       }catch (Exception e){
            e.printStackTrace();
            return null;
       }finally {
           if (ossClient != null) {
               ossClient.shutdown();
           }
       }
    }
}

postman测试:
在这里插入图片描述

可以看到,已经上传成功。
在这里插入图片描述

8、改进

1. 多次上传相同名称文件,会造成最后一次上传把之前上传文件覆盖

改进方法:在文件名称添加随机唯一值,让每个文件名称不同

  			/**产生随机值*/
           String uuid = UUID.randomUUID().toString().replaceAll("-", "");
           filename = filename.concat(uuid);

2. 把文件进行分类管理

改进方法:根据日期进行分类,实现年月日分类
如果ossClient.putObject中的第二个参数形式为aa/bb/1.jpg,则上传到OSS后,OSS会创建aa/bb目录。

			/**把文件按照日期进行分类*/
           String datePath = new DateTime().toString("yyyy/MM/dd");
           filename = datePath.concat("/").concat(filename);

还是传之前的图片,结果👇:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Segment Anything学习小结

论文地址&#xff1a;Segment Anything 项目地址&#xff1a;https://github.com/facebookresearch/segment-anything 在线Demo&#xff1a; https://segment-anything.com/demo 前言 近日&#xff0c;MetaAI团队开源了一个用于分割的10亿个masks&#xff0c;1100w张图片数…

测试新手如何晋升为月入过万的软件测试工程师?“我“的测试之路不简单...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试工程师这个岗…

记一次binlog恢复Mysql某张表数据的过程

1、备份数据库&#xff0c;非常重要 2、要用户不能操作&#xff08;如果不能停止&#xff0c;可以新建一个库&#xff0c;所有的binlog执行操作在新库执行&#xff09;。 3、登录服务器&#xff1b; 4、获取Mysql数据路径 cat /etc/my.cnf.d/mysql-server.cnf5、进入当前目录…

【SpinalHDL快速入门】4.2、基本类型之Bits

文章目录 1.1、描述1.2、声明1.3、运算符1.3.1、逻辑运算&#xff08;Logic&#xff09;1.3.2、比较&#xff08;Comparison&#xff09;1.3.3、类型转换&#xff08;Type cast&#xff09;1.3.4、部分赋值/提取操作符&#xff08;Bit extraction&#xff09;1.3.5、杂项&#…

Redis的使用规范小建议

Redis 核心技术与实战 笔记 作者&#xff1a; 蒋德钧 毕竟&#xff0c;高性能和节省内存&#xff0c;是我们的两个目标&#xff0c;只有规范地使用Redis&#xff0c;才能真正实现这两个目标。如果说之前的内容教会了你怎么用&#xff0c;那么今天的内容&#xff0c;就是帮助你用…

ChatGPT的学习过程【分析ChatGPT原理】+如何高效使用GPT

ChatGPT的学习过程【分析ChatGPT原理】如何高效使用GPT 此处借鉴&#xff1a;台湾大学李宏毅老师的讲解 资料&#xff1a;pan.baidu.com/s/1Jk1phne3ArfOERYNTPL12Q?pwd1111 GPTGenerative Pre-trained Transformer生成式预训练转换模型 ChatGPT共有四个学习阶段 学习文字接龙…

Java性能权威指南-总结7

Java性能权威指南-总结7 垃圾收集算法理解Throughput收集器堆大小的自适应调整和静态调整理解CMS收集器 垃圾收集算法 理解Throughput收集器 Throughput收集器有两个基本的操作&#xff1b;其一是回收新生代的垃圾&#xff0c;其二是回收老年代的垃圾。 下图展示了堆在新生代…

Python配置MySQL数据库使用

创建配置文件 config.ini [MySQL] host 172.xxx.xxx.xxx port 3306 user root password ****** db bgp_routing charset utf8创建读取配置文件 readConfig.py import configparser from pathlib import Pathclass ReadConfig():def __init__(self):configDir Path.cwd…

【学习日记2023.6.6】之 Linux环境下部署Java项目

文章目录 5. 项目部署5.1 手动部署项目5.2 基于Shell脚本自动部署5.2.1 介绍5.2.2 推送代码到远程5.2.3 Git操作5.2.4 Maven安装5.2.5 Shell脚本准备5.2.6 Linux权限5.2.7 授权并执行脚本5.2.8 设置静态IP 5. 项目部署 开发的项目绝大部分情况下都需要部署在Linux系统中。下面通…

springboot+vue多维的知识分类管理系统

随着国内市场经济这几十年来的蓬勃发展&#xff0c;突然遇到了从国外传入国内的互联网技术&#xff0c;互联网产业从开始的群众不信任&#xff0c;到现在的离不开&#xff0c;中间经历了很多挫折。本次开发的多维分类的知识管理系统有管理员和用户两个角色。管理员可以管理用户…

Dozzle-解决通过命令方式查看Docker 日志的神器

对于程序员们来说&#xff0c;Docker 一定是不陌生了。Docker 为我们的工作带来的巨大的便利&#xff0c;你可以使用它快速部署和扩展应用程序&#xff0c;并保证隔离性和可移植性&#xff0c;使应用程序在容器内独立运行&#xff0c;而且可以轻松地在不同的主机和操作系统上移…

bpmn是什么?bpmn.js的简单使用

文章目录 一、bpmn.js是什么&#xff1f;二、使用步骤1.引入bpmn2.使用bpmn3.引入bpmn-左侧工具栏4.引入bpmn-左侧工具栏5.引入bpmn数据导出6.数据导出为svg格式7.监听modeler并绑定事件7.监听element点击……8.自定义左侧工具栏图标9.自定义左侧工具栏完整效果 总结 一、bpmn.…

推动体系建设 助推融合发展|2023 开放原子全球开源峰会软件物料清单(SBOM)分论坛即将启幕

软件物料清单对于普通人而言可能很陌生&#xff0c;而对于从业者而言&#xff0c;软件物料清单是以 “开源” 为核心&#xff0c;通过有效识别和记录软件组成成分及相互依赖关系&#xff0c;保障软件全生命周期各环节要素的可控制、可预测、可管理。 由开放原子开源基金会主办…

云原生Docker网络管理和数据卷

Docker网络 Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c; Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c; 同时Docker网桥是每个容器的默认网关。 …

案例26:基于Springboot校园社团管理系统开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

那些你可能遇到的 Linux 命令?什么,你还不知道?赶紧收藏?完善中!

文章目录 一. Linux 进程1. 通过进程名查找进程号1.1 ps aux & ps -ef&#xff1a;diff1.2 ps aux & ps -aux&#xff1a;什么&#xff1f;它们不一样&#xff1f;1.3 grep & awk&#xff1a;取出进程号、取出进程号并 Kill 2. 通过进程号查看进程信息&#xff1a;…

视频理解学习笔记(四)

视频理解学习笔记&#xff08;四&#xff09; 3D CNNC3DI3DNon-local算子 &#xff08;Self-attention替换掉LSTM&#xff09;R (2 1) DSlowFast Video TransformerTimeSformer 总结Reference 3D CNN 双流的缺点&#xff1a;光流抽取太慢——tvl one算法&#xff0c;0.06s抽取…

什么是浅拷贝和深拷贝

javascript 中有不同的方法来复制对象,那么我们怎样才能正确地复制一个对象呢?&#xff0c;本文来介绍一下浅拷贝和深拷贝。 一、什么是浅拷贝(Shallow Copy) 浅拷贝是创建一个新对象&#xff0c;这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型&#xff0c;拷…

遗传算法在数学建模中的应用及MATLAB实现

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 遗传算法基本概念 遗传算法原理 MATLAB实现 1. 使用ga求解遗传算法问题 数学建模案例&#xff1a;旅行商问题&#xff08;TSP&#xf…

操作系统原理 —— 内存连续分配管理方式(二十)

在之前的章节中&#xff0c;我们到了内存管理&#xff0c;其中有一个很重要的功能&#xff0c;就是对操作系统中的内存进行分配和回收。 那如何对操作系统的内存进行分配呢&#xff1f; 整体上可以分为两种方式&#xff1a;连续分配管理方式、非连续分配管理方式。 这里提到的…