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

news/2024/11/16 15:29:05/

文章目录

  • 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: serviceservlet:multipart:max-file-size: 100MBmax-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;@Overridepublic 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 {@Autowiredprivate OssService ossService;@PostMappingpublic 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 {@Overridepublic 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.ppmy.cn/news/247231.html

相关文章

九、RGBA数据转YUV422存储

1、介绍 将RGBA转换为YUV数据&#xff0c;首先我们是知道有公式是可以将RGBA转换为YUV的&#xff0c;但是图像的每个像素都有一个R、G、B&#xff0c;A值的&#xff0c;但是YUV422(就是两个像素两个Y一个U一个V的)&#xff0c;因此我们还需要将一个像素的RGBA四个值转换为YUV三…

《Lua程序设计》--学习1

前言&#xff1a; --> 表示一条语句的输出或表达式求值的结果 -- 单行注释 > 标注 一些代码需要在交互模式下输入 如果需要打印表达式求值的结果&#xff0c;必须在每个表达式前加上一个等号 <--> 表示两者完全等价 语言基础 我们将Lua语言执行的每一…

倍福--AX5000 PDO参数的调节

调整了伺服的速度环、位置环之后,遇到一个问题是直线电机高速的时候移动顺滑,但是低速的时候会出现抖动的情况,要进一步提高伺服运动的性能,还需要进一步优化PDI参数,本文补充几个优化PDI参数的方面。 操作流程 1.1. 调整的速度环位置环如下 1.2. 把PLC的任务周期适当减少…

双剑合璧看高清 飞利浦HMP5000高清播放机解析

无论电影或音响发烧友&#xff0c;都越来越热衷于高清视频的欣赏。借助网络下载和在线影视播放&#xff0c;安坐家中就能享受各式大片与热门剧集。要获得如此丰富的节目源&#xff0c;高清播放机自然不可少。面对品类繁多、良莠不齐的市场现状&#xff0c;如何选择就成了一大难…

第七章:单行函数

第七章&#xff1a;单行函数 7.1&#xff1a;函数的理解 什么是函数 ​ 函数在计算机语言的使用中贯穿始终&#xff0c;函数的作用是什么呢&#xff1f;它可以把我们经常使用的代码封装起来&#xff0c;需要的时候直接调用即可。这样即提高了代码效率&#xff0c;又提高了可维…

Linux手机DIY.夏新E600和飞利浦968初探

Linux手机DIY.夏新E600和飞利浦968初探 草木瓜 更新于 2006-10-21 一、序 无意中被小叶拉来&#xff0c;协助破解夏新E600的第三方软件安装。虽经过众位兄弟的齐心努力&#xff0c;然至今却未能取得突破性进展。失败了无数次&#xff0c;也否定了无数次设想和可能。一个人的…

大厂旗舰有何魅力?·飞利浦Fidelio X3演绎HiFi臻声

【如“沐”春风&#xff0c;带你找到更多悦耳动听】 在快节奏的生活背景下&#xff0c;使用蓝牙耳机似乎成为了更便捷、更容易的存在&#xff0c;但靠算法得到的音质提升&#xff0c;还是无法和高保真相提并论。加上连接、延迟和舒适度等原因&#xff0c;真正静下心想享受音乐…

倍福--AX5000驱动器的参数设置

操作流程 1.1. 扫描硬件 控制器切换到Config Mode,在I/O — Device 上点右键,选择“Scan”,扫面硬件。扫描到驱动器后,系统会提示是否添加NC-Task,选择是,自动添加NC任务和NC轴,NC轴自动关联到驱动器。在Axes — Online 界面,可以看到所有NC轴的连接信息1.2. 配置电机和…