SpringBoot - 阿里云OSS对象存储简介及简单上传

本文介绍了如何使用SpringBoot集成阿里云OSS对象存储服务,包括申请OSS、创建Bucket、配置AccessKey权限。通过SpringBoot实现文件上传、删除等操作,并提供了相关配置代码示例。此外,还提到了基于SMM的初步实践。

OSS是一种分布式文件存储的一个不错选择,对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。

申请阿里OSS,创建Bucket

oss是收费的,每个bucket是一个存储空间,可以根据不同的项目创建不同的Bucket。

这个AccessKey账号,需要添加如下几个权限

一、入门示例 - 基于SpringBoot

官方文档: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

endPoint在哪找?如图:

httpsprefix访问前缀是什么?

比如:
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

 

二、入门示例 - 基于SMM

这是刚学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();
    }
}

 

 

使用Spring管理OSSClient

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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值