SpringBoot使用阿里OSS实现文件云存储的方法

网友投稿 297 2022-11-15


SpringBoot使用阿里OSS实现文件云存储的方法

前言

我们在项目中经常会使用到图片或者文档资源,一般来说如何这类文件比较少的时候我们可以直接存在在服务器中,但是如果一旦这些文件到达一定数量的时候如果在放在应用服务器必然会影响应用服务器的性能,并且有时候这些图片资源也要直接用在前端显示当中,所以放在应用服务器也是不妥的。一些比较大的互联网公司可能会使用一些分布式文件系统来达到存储文件的目的,但这种方式门槛过高。如何找到一个合适且性价比高的文件存储方式呢?那么不得不说的就是对象存储服务OSS.

FastDFS分布式文件系统可参考我的博客:FastDFS分布式文件系统

正文

对象存储服务

对象存储服务(OSS):是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件:

OSS可用于图片、音视频、日志等海量文件的存储。

各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。

OSS支持流式写入和文件写入两种方式。

简单地来说,我们通过OSS可以避免在服务器中存储大量的文件、图片等资源增加服务器的IO的读写带宽。

SpringBoot使用阿里OSS实现文件云存储 前期准备

第一步:在阿里云商城购买对象存储服务

第二步:在阿里云控制台配置AccessKey

代码部分

maven依赖

com.aliyun.oss

aliyun-sdk-oss

3.5.0

commons-io

commons-io

2.4

commons-fileupload

commons-fileupload

1.3.3

application.properties:配置类

##basic setting

server.port = 8080

server.address =127.0.0.1

# 解除文件大小限制

spring.servlet.multipart.max-file-size=10MB

spring.servlet.multipart.max-request-size=10MB

OssManagerUtil.java:阿里OSS工具类

/**

* 阿里Oss对象存储工具类

*/

public class OssManagerUtil {

private static String endpoint = “oss中获取的oss公网路径";

private static String accessKeyId = “自己在阿里云申请的accessKeyId";

private static String accessKeySecret = "自己在阿里云申请的accessKeySecret";

private static String bucket = "bucket名称";

private stZvnAOmtatic OSS client;

static {

client = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

}

/**

* 上传图片

*

* @param fileName 图片名称,图片名称包括文件夹名称和“/”

* @param length 图片大小

* @param content 输入流

*/

public static String uploadImage(String fileName, long length, InputStream content) {

uploadBucketImage(bucket, fileName, length, content);

return "https://" + bucket + "." + endpoint + "/" + fileName;

}

/**

* 上传文件

*

* @param bucket 存储空间名

* @param fileName 文件名(包括文件夹名称和“/”)

* @param length 流的长度

* @param contZvnAOmtent 输入流

*/

public static void uploadBucketImage(String bucket, String fileName, long length, InputStream content) {

// 创建上传Object的Metadata

ObjectMetadata meta = new ObjectMetadata();

// 必须设置ContentLength

meta.setContentLength(length);

// 上传Object.

client.putObject(bucket, fileName, content, meta);

}

/**

* 删除文件

*

* @param fileName 文件名称,图片名称包括文件夹名称和“/”

*/

public static boolean delShopImage(String fileName) {

//判断文件是否存在

boolean exist = client.doesObjectExist(bucket, fileName);

//文件不存在删除失败

if (!exist) {

return false;

}

//执行删除

client.deleteObject(bucket, fileName);

return true;

}

/**

* 获得上传文件后url链接

*

* @param fileName 文件名(包括文件夹名称和“/”)

* @return

*/

public static String getUrl(String fileName) {

// 设置URL过期时间为10年 3600l* 1000*24*365*10

Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);

// 生成URL

URL url = client.generatePresignedUrl(bucket, fileName, expiration);

if (url != null) {

return url.toString();

}

return null;

}

/**

* 创建存储空间

*

* @param bucketName 新建存储空间默认为标准存储类型,私有权限。

* @return

*/

public static void crateBucket(String bucketName) {

// 新建存储空间默认为标准存储类型,私有权限。

client.createBucket(bucketName);

}

}

验证

测试接口:文件上传

/**

* 文件上传到阿里oss

*/

@PostMapping("/uploadFiletoOss")

@ApiOperation(value = "文件上传到阿里oss")

public ResponseResult uploadFiletoOss(@RequestParam("file")MultipartFile file)throws IOException{

String fileName = file.getOriginalFilename();

String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);

fileName = UUID.randomUUID().toString().replace("-", "") + "." + suffix;

String url = OssManagerUtil.uploadImage(fileName,file.getInputStream().available(),file.getInputStream());

return ResponseResult.success(url);

}

访问测试接口:

打开接口返回的OSS在线文件URL,得到在线文件:

源码

项目源码可从的我的github中获取:github源码地址


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring和SpringBoot有哪些区别
下一篇:Hibernate双向多对多映射关系配置代码实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~