赞
踩
OSS是一种分布式文件存储的一个不错选择,对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。
AccessKey用于程序方式调用云服务API,通常由AccessKeyId和AccessKeySecret这两个组成部分。AccessKeyId用于标识用户,AccessKeySecret用于验证用户的秘钥。
oss是收费的,每个bucket是一个存储空间,可以根据不同的项目创建不同的Bucket。
官方文档:OSS - Java SDK官网文档地址
1、引入pom依赖
- <!-- 阿里云OSS -->
-
- <dependency>
-
- <groupId>com.aliyun.oss</groupId>
-
- <artifactId>aliyun-sdk-oss</artifactId>
-
- <version>3.8.0</version>
-
- </dependency>
2、配置文件 - application.properties
- # EndPoint
-
- aliyun.oss.file.endpoint=xxxx
-
- # KeyId
-
- aliyun.oss.file.keyid=xxxx
-
- # KeySecret
-
- aliyun.oss.file.keysecret=xxxx
-
- # bucketName
-
- aliyun.oss.file.bucketname=xxxx
-
- # 访问图片的固定前缀
-
- aliyun.oss.file.httpsprefix=xxxx
-
- # 最大上传单个文件大小:默认1M
-
- spring.servlet.multipart.max-file-size=1024MB
-
- # 最大置总上传的数据大小 :默认10M
-
- spring.servlet.multipart.max-request-size=1024MB

比如:
https://jiuyue.oss-cn-chengdu.aliyuncs.com
jiuyue就是bucketName
后面那个就是endpoint
3、创建一个工具类 - 主要用于读取配置文件里的bucketName和固定前缀
- @Component
-
- public class OssConstant implements InitializingBean {
-
- /** 从配置文件中读取bucketName */
-
- @Value("${aliyun.oss.file.bucketname}")
-
- private String bucketName;
-
- /** 从配置文件中读取存储文件的地址前缀 */
-
- @Value("${aliyun.oss.file.httpsprefix}")
-
- private String ossHttpsPrefix;
-
-
- public static String BUCKET_NAME;
-
- public static String OSS_HTTPS_PREFIX;
-
-
- @Override
-
- public void afterPropertiesSet() throws Exception {
-
- BUCKET_NAME = bucketName;
-
- OSS_HTTPS_PREFIX = ossHttpsPrefix;
-
- }
-
-
- }

4、创建一个配置类,主要是配置OSSClient,方便注入
- @Configuration
-
- public class OssConfig {
-
- /** 从配置文件中读取endPoint */
-
- @Value("${aliyun.oss.file.endpoint}")
-
- private String ossEndpoint;
-
- /** 从配置文件中读取KeyId */
-
- @Value("${aliyun.oss.file.keyid}")
-
- private String keyId;
-
- /** 从配置文件中读取KeySecret */
-
- @Value("${aliyun.oss.file.keysecret}")
-
- private String keySecret;
-
-
- @Bean
-
- public OSSClient ossClient(){
-
- return (OSSClient) new OSSClientBuilder().build(ossEndpoint, keyId, keySecret);
-
- }
-
- }

5、创建一个Controller - 主要功能是上传、删除/批量删除图片、查询图片是否存在
更多api请见官方文档:OSS - Java SDK 官方文档
- @RestController
-
- @RequestMapping("/oss")
-
- public class OssController {
-
- @Autowired
-
- private OSSClient ossClient;
-
-
- /**
- * 上传图片到OSS
- * @param file 图片文件
- * @return 图片访问地址
- */
-
- @PostMapping("/upload")
-
- public String ossUpload(MultipartFile file){
-
- // 获取原始文件名(我一般都是用UUID生成新的文件名)
-
- String fileName = file.getOriginalFilename();
-
- // 文件夹名(可以用模块名)
-
- String folder = "liuchengyin";
-
- // 文件夹名(根据日期来存储)
-
- String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
-
- // 文件名 - 使用UUID生成
-
- String fileNameUUID = UUID.randomUUID().toString().replaceAll("-", "");
-
- if (fileName != null){
-
- // 获取原始文件名的后缀,如.jpg .png
-
- fileNameUUID = folder+ "/" + format + "/" + fileNameUUID + fileName.substring(fileName.lastIndexOf("."));
-
- } else {
-
- // 一般来说这种情况是不存在的
-
- fileNameUUID = folder+ "/" + format + "/" + fileNameUUID + ".jpg";
-
- }
-
- try {
-
- ossClient.putObject(OssConstant.BUCKET_NAME, fileNameUUID, file.getInputStream());
-
- } catch (IOException e) {
-
- e.printStackTrace();
-
- }
-
- // 返回文件访问地址 - 这里可以封装一个对象,返回访问地址和文件名(也就是fileNameUUID)
-
- // 这个文件名(fileNameUUID)可以用于查询是否存在、删除等操作
-
- return OssConstant.OSS_HTTPS_PREFIX + "/" + fileNameUUID;
-
- }
-
-
- /**
- * 删除OSS里的文件/文件夹(文件夹内不能有文件)
- * @param fileName 文件名 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
- * @return
- */
-
- @PostMapping("/delete")
-
- public String ossDelete(String fileName){
-
- ossClient.deleteObject(OssConstant.BUCKET_NAME, fileName);
-
- return "删除成功!";
-
- }
-
-
- /**
- * 批量删除OSS里的文件
- * @param fileNames 文件名集合 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
- * @return
- */
-
- @PostMapping("/deleteBatch")
-
- public List<String> ossDeleteBatch(@RequestBody List<String> fileNames){
-
- DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(OssConstant.BUCKET_NAME).withKeys(fileNames));
-
- // 返回的就是删除成功的图片名集合(图片不存在,也会返回)
-
- return deleteObjectsResult.getDeletedObjects();
-
- }
-
-
- /**
- * 查询OSS里的文件是否存在
- * @param fileName 文件名 - 完整文件名包括文件夹名,如:liuchengyin/2021-03-23/f624048f7ca8466881f825365e3308d4.jpg
- * @return 是否存在:true or false
- */
-
- @GetMapping("/exist")
-
- public Boolean isExist(String fileName) {
-
- return ossClient.doesObjectExist(OssConstant.BUCKET_NAME, fileName);
-
- }
-
- }

使用postman测试上传文件的方式:
Github地址:SpringBoot - OSS对象存储Demo
Gitee地址:SpringBoot - OSS对象存储Demo
这是刚学SSM没多久时写的文章,相当于上面那个不是太完整(懒得删)。
1、引入pom依赖
- <dependency>
-
- <groupId>com.aliyun.oss</groupId>
-
- <artifactId>aliyun-sdk-oss</artifactId>
-
- <version>3.8.0</version>
-
- </dependency>
2、代码测试
- public class FileUpload {
-
- // 上传文件流的方式 - 常用
-
- public static void main(String[] args) throws FileNotFoundException {
-
- // Endpoint以成都为例,其它Region请按实际情况填写。
-
- String endpoint = "http://oss-cn-chengdu.aliyuncs.com";
-
- // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维
-
- String accessKeyId = "Xxxxxx";
-
- String accessKeySecret = "Aaaaaaaa";
-
- // 创建OSSClient实例
-
- OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
-
- // 上传文件流 - 文件地址
-
- InputStream inputStream = new FileInputStream("f:\\成果.jpg");
-
- // 存储BucketName、上传到OSS的文件名
-
- ossClient.putObject("liuchengyin", "狗哥.jpg", inputStream);
-
- // 关闭OSSClient
-
- ossClient.shutdown();
-
- }
-
- }

1、在Spring配置文件中添加如下
- <!--阿里云OSS -->
-
- <bean id="ossClient" class="com.aliyun.oss.OSSClient">
-
- <!-- Endpoint以成都为例,其它Region请按实际情况填写 -->
-
- <constructor-arg index="0" value="oss-cn-chengdu.aliyuncs.com"></constructor-arg>
-
- <!-- AccessKeyID -->
-
- <constructor-arg index="1" value="AccessKeyID"></constructor-arg>
-
- <!-- AccessKeySecret -->
-
- <constructor-arg index="2" value="AccessKeySecret"></constructor-arg>
-
- </bean>

2、上传后端代码示例
- @Controller
-
- public class uploadController{
-
- // 注入OSSClient
-
- @Autowired
-
- private OSSClient ossClient;
-
-
- /**
- * 上传图片
- * @param file 文件
- * @param folder 文件所在文件夹名
- */
-
- @PostMapping("/upload")
-
- public String ossUpload(@RequestParam("file") MultipartFile file,String folder){
-
- // BucketName
-
- String bucketName = "liuchengyin";
-
- // 获取原始的文件名
-
- String fileName = file.getOriginalFilename();
-
- // 使用UUID来处理文件名随机
-
- fileName = folder + "/" + UUID.randomUUID() + file.getOriginalFilename();
-
-
- try{
-
- ossClient.putObject(bucketName,fileName,file.getInputStream());
-
- }.cathc(Exception e){
-
- e.printStackTrace();
-
- }
-
- // 返回图片地址
-
- return "https://" + bucketName + ".oss-cn-chengdu.aliyuncs.com/" + fileName;
-
- }
-
- }

综上原链接: SpringBoot - 阿里云OSS对象存储简介及简单上传_江南烟雨却痴缠丶-CSDN博客
参考连接:基于springboot框架做oss文件上传功能具体实现_小白划水的博客-CSDN博客_springboot 上传oss
1.引入.pom
- <dependency>
- <groupId>com.aliyun.oss</groupId>
- <artifactId>aliyun-sdk-oss</artifactId>
- <version>3.10.2</version>
- </dependency>
2.java 代码
- package com.safe.smartsite.base.controller;
-
- import java.io.ByteArrayInputStream;
- import com.aliyun.oss.OSS;
- import com.aliyun.oss.OSSClientBuilder;
- import com.safe.common.core.rest.RestResponse;
- import org.apache.commons.lang3.RandomUtils;
- import org.joda.time.DateTime;
- import org.apache.commons.lang.StringUtils;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.bind.annotation.RestController;
- import org.springframework.web.multipart.MultipartFile;
- import java.util.List;
-
- /**
- * @author LAn
- * @date 2022年02月17日 17:19
- */
- @RequestMapping("/oss_upload")
- @RestController
- public class OSSUploadController {
- // 公共云下OSS Region和Endpoint 参照对照表(请求上传连接)
- private static String endpoint = "https://oss-cn-beijing.aliyuncs.com";
- private static String accessKeyId = "秘钥标识ID";
- private static String accessKeySecret = "秘钥";
- // 获取 OSS创建的桶 名称
- private static String bucketName = "oss-sjgr-oa";
- // 上传到 OSS 指定的路径
- private static String objectName = "exampledir/exampleobject.txt";
-
- // 允许上传的格式
- private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",
- ".jpeg", ".gif", ".png"};
-
- @RequestMapping(value = "/upload")
- public RestResponse<List<FileController.ReturnFile>> upload(@RequestParam("file") MultipartFile file) {
- // 校验图片格式
- boolean isLegal = false;
- for (String type : IMAGE_TYPE) {
- if (StringUtils.endsWithIgnoreCase(file.getOriginalFilename(),
- type)) {
- isLegal = true;
- break;
- }
- }
- if (!isLegal) {
- return null;
- }
- //文件新路径
- String fileName = file.getOriginalFilename();
- String filePath = getFilePath(fileName);
- OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
- // 上传到阿里云
- try {
- ossClient.putObject(bucketName, filePath, new ByteArrayInputStream(file.getBytes()));
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("上传失败<<<<<<<<<<<<<<<<");
- //上传失败
- return null;
- }
- System.out.println("上传成功!!!!");
- //this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保存到数据库
- return null;
- }
- /**
- * 通过源文件获取 路径和文件名
- * @param sourceFileName
- * @return
- */
- private String getFilePath(String sourceFileName) {
- DateTime dateTime = new DateTime();
- return "images/" + dateTime.toString("yyyy")
- + "/" + dateTime.toString("MM") + "/"
- + dateTime.toString("dd") + "/" + System.currentTimeMillis() +
- RandomUtils.nextInt(100, 9999) + "." +
- StringUtils.substringAfterLast(sourceFileName, ".");
- }
-
-
- }

3. 采坑 报如下错误可尝试引入以下配置:
java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy 错误解决办法 引入pom文件
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.5.5</version>
- </dependency>
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpcore</artifactId>
- <version>4.4.5</version>
- </dependency>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。