SpringBoot文件云存储 SpringBoot使用阿里OSS实现文件云存储的方法
溪源的奇思妙想 人气:0想了解SpringBoot使用阿里OSS实现文件云存储的方法的相关内容吗,溪源的奇思妙想在本文为您仔细讲解SpringBoot文件云存储的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:SpringBoot文件云存储,SpringBoot阿里OSS云存储,下面大家一起来学习吧。
前言
我们在项目中经常会使用到图片或者文档资源,一般来说如何这类文件比较少的时候我们可以直接存在在服务器中,但是如果一旦这些文件到达一定数量的时候如果在放在应用服务器必然会影响应用服务器的性能,并且有时候这些图片资源也要直接用在前端显示当中,所以放在应用服务器也是不妥的。一些比较大的互联网公司可能会使用一些分布式文件系统来达到存储文件的目的,但这种方式门槛过高。如何找到一个合适且性价比高的文件存储方式呢?那么不得不说的就是对象存储服务OSS
.
FastDFS分布式文件系统可参考我的博客:FastDFS分布式文件系统
正文
对象存储服务
对象存储服务(OSS
):是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件:
OSS
可用于图片、音视频、日志等海量文件的存储。- 各种终端设备、
Web
网站程序、移动应用可以直接向OSS
写入或读取数据。 OSS
支持流式写入和文件写入两种方式。
简单地来说,我们通过OSS
可以避免在服务器中存储大量的文件、图片等资源增加服务器的IO
的读写带宽。
SpringBoot使用阿里OSS实现文件云存储 前期准备
第一步:在阿里云商城购买对象存储服务
第二步:在阿里云控制台配置AccessKey
代码部分
maven依赖
<!--oss对象关系存储--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.5.0</version> </dependency> <!--apache comment tools--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <!--提供文件上传下载--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency>
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 static 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 content 输入流 */ 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源码地址
加载全部内容