SpringBoot2.x系列教程24--SpringBoot实现文件上传到OSS阿里云存储

本文涉及的产品
对象存储 OSS,标准 - 本地冗余存储 20GB 3个月
对象存储 OSS,内容安全 1000 次 1年
对象存储OSS,敏感数据保护2.0 200GB 1年
简介: 前言在上一章节中,壹哥 给大家讲解了如何在SpringBoot实现单个文件和多个文件上传,但是那种方式现在挺多项目中都不再采用了,而是会把文件上传到云存储服务器中,比如阿里云、腾讯云、华为云等。所以今天 壹哥 利用阿里云的OSS存储,讲解如何把本地文件存储到云存储服务器中,本文会教给你如何购买配置阿里云OSS,并且教你如何实现文件上传到云空间,干货满满哦。一. 阿里云OSS简介1. 存储服务简介我们进行项目开发,很多时候都需要进行文件、图片等的上传,对于很多项目来说,虽然有FastDFS等文件存储服务器技术,但其实我们完全没有必要搭建自己的图片等文件服务器。对一个小型非专业的应用来说,

前言

在上一章节中,壹哥 给大家讲解了如何在SpringBoot实现单个文件和多个文件上传,但是那种方式现在挺多项目中都不再采用了,而是会把文件上传到云存储服务器中,比如阿里云、腾讯云、华为云等。所以今天 壹哥 利用阿里云的OSS存储,讲解如何把本地文件存储到云存储服务器中,本文会教给你如何购买配置阿里云OSS,并且教你如何实现文件上传到云空间,干货满满哦。

一. 阿里云OSS简介

1. 存储服务简介

我们进行项目开发,很多时候都需要进行文件、图片等的上传,对于很多项目来说,虽然有FastDFS等文件存储服务器技术,但其实我们完全没有必要搭建自己的图片等文件服务器。对一个小型非专业的应用来说,搭建自己的专属文件存储服务器,完全就是浪费,而且也不一定有那样的实力。

但是我们项目中经常需要进行头像等其他文件的上传等操作,那么如何实现呢?

我推荐首选阿里云存储,便宜又靠谱。

阿里云提供了一个对象存储 OSS服务,可以实现海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%的数据可靠性。并且使用RESTful API 可以在互联网任何位置存储和访问,容量和处理能力弹性扩展,多种存储类型供选择全面优化存储成本。

2. 购买阿里云OSS服务

首选搜索阿里云,选择第一个就是了。

然后选择云计算基础里的对象存储OSS产品。

可以看到,40G的一年存储服务才9块钱,很便宜了,对于学习来说足够了。

3. 阿里云OSS控制台简介

点击首页的控制台链接就可以进入后台。

4. 创建Bucket桶空间

在这里创建一个Bucket桶,作为存储文件的空间。

桶名不能重复。

可以在自己的桶空间中创建子目录,用来存储不同项目或模块下的文件。

5. 设置桶空间访问权限

接下来要设置该目录的访问权限,可以设置为公共读。

再设置一下该桶的授权策略。

二. SpringBoot中实现OSS云存储

1. 创建Web项目

我们按照之前的经验,创建一个Web程序,并将之改造成Spring Boot项目,具体过程略。

2. 添加依赖包

在项目中添加如下核心依赖包,比较重要的是web依赖和aliyun的依赖包。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--简化bean代码--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- Thymeleaf--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- 图片上传 SDK 阿里云oss --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>2.8.3</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency>

3. 添加配置信息

我们可以在阿里云后台的如下位置,查看自己阿里云账号的AccessKey信息。

在这里复制自己的AccessKey ID与Secret信息,然后粘贴到自己的配置文件中。

请在application.properties或application.yml文件中添加如下格式的配置信息,重要的是把自己的AccessKey ID与Secret信息粘贴进来。

bucketName: "yiyige"accessKeyId: "自己阿里云的accessKey"accessKeySecret: "自己阿里云的accessKey"#OSS对应的区域endpoint: "http://oss-cn-hangzhou.aliyuncs.com"filehost: "images"

4. 创建配置信息类

为了方便调用,我们封装一个配置信息类,后面就可以直接通过Get/Set方法来调用这些配置信息了。

packagecom.yyg.boot.config;
importlombok.Data;
importlombok.Getter;
importlombok.Setter;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.stereotype.Component;
/*** 把配置文件中的配置信息读取到该类中.*/@Data@ConfigurationpublicclassOssConfiguration {
@Value("${endpoint}")
privateStringendPoint;
@Value("${accessKeyId}")
privateStringaccessKeyId;
@Value("${accessKeySecret}")
privateStringaccessKeySecret;
@Value("${filehost}")
privateStringfileHost;
@Value("${bucketName}")
privateStringbucketName;
}

5. 封装阿里云文件上传工具类

然后我这里封装了一个文件上传工具类,用于实现文件上传功能。

packagecom.yyg.boot.util;
importcom.aliyun.oss.OSSClient;
importcom.aliyun.oss.model.CannedAccessControlList;
importcom.aliyun.oss.model.CreateBucketRequest;
importcom.aliyun.oss.model.PutObjectRequest;
importcom.aliyun.oss.model.PutObjectResult;
importcom.yyg.boot.config.OssConfiguration;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importjava.io.File;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjava.util.UUID;
/*** 封装文件上传方法*/@ComponentpublicclassAliyunOssUtil {
@AutowiredprivateOssConfigurationconfig;
publicStringupload(Filefile) {
if (file==null) {
returnnull;
        }
StringendPoint=config.getEndPoint();
StringkeyId=config.getAccessKeyId();
StringkeySecret=config.getAccessKeySecret();
StringbucketName=config.getBucketName();
StringfileHost=config.getFileHost();
//定义子文件的格式SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd");
StringdateStr=format.format(newDate());
//阿里云文件上传客户端OSSClientclient=newOSSClient(endPoint, keyId, keySecret);
try {
//判断桶是否存在if (!client.doesBucketExist(bucketName)) {
//创建桶client.createBucket(bucketName);
CreateBucketRequestcreateBucketRequest=newCreateBucketRequest(bucketName);
//设置访问权限为公共读createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
//发起创建桶的请求client.createBucket(createBucketRequest);
            }
//当桶存在时,进行文件上传//设置文件路径和名称StringfileUrl=fileHost+"/"+ (dateStr+"/"+UUID.randomUUID().toString().replace("-", "") +"-"+file.getName());
PutObjectResultresult=client.putObject(newPutObjectRequest(bucketName, fileUrl, file));
client.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
//文件上传成功后,返回当前文件的路径if (result!=null) {
returnfileUrl;
            }
        } catch (Exceptione) {
e.printStackTrace();
        } finally {
if (client!=null) {
client.shutdown();
            }
        }
returnnull;
    }
}

6. 编写Controller接口

接着再创建一个Controller文件上传接口,上传我们的文件到阿里云中。

packagecom.yyg.boot.web;
importcom.yyg.boot.util.AliyunOssUtil;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.GetMapping;
importorg.springframework.web.bind.annotation.PostMapping;
importorg.springframework.web.bind.annotation.RequestParam;
importorg.springframework.web.multipart.MultipartFile;
importjava.io.File;
importjava.io.FileOutputStream;
@ControllerpublicclassOssController {
@AutowiredprivateAliyunOssUtilossUtil;
@GetMapping("/")
publicStringshowUploadFile() {
return"upLoad";
    }
@PostMapping("/uploadFile")
publicStringupload(@RequestParam("file") MultipartFilefile) {
try {
if (file!=null) {
StringfileName=file.getOriginalFilename();
if (!"".equals(fileName.trim())) {
FilenewFile=newFile(fileName);
FileOutputStreamos=newFileOutputStream(newFile);
os.write(file.getBytes());
os.close();
//把file里的内容复制到奥newFile中file.transferTo(newFile);
Stringupload=ossUtil.upload(newFile);
//图片回显地址://http://yiyige.oss-cn-hangzhou.aliyuncs.com/images/2019-10-21/6c964702b67d4eeb920e7f1f4358189b-dishu.jpgSystem.out.println("path="+upload);
                }
            }
        } catch (Exceptione) {
e.printStackTrace();
        }
return"success";
    }
}

7. 编写文件上传页面

编写一个文件上传页面,请参考之前的章节实现。

<!DOCTYPE html><htmlxmlns="http://www.w3.org/1999/xhtml"xmlns:th="http://www.thymeleaf.org"><head><metacharset="UTF-8"/><title>【基于OSS的上传文件页面】</title><linkrel="stylesheet"th:href="@{/css/bootstrap.min.css}"media="all"/><styletype="text/css">        *{
margin:0;
padding:0;
        }
#group{
position: absolute;
left:580px;
        }
#submit{
position: absolute;
top:140px;
left:580px;
        }
</style></head><body><divalign="center"><h2style="color:orangered;">基于OSS的上传文件页面</h2></div><br/><formaction="/uploadFile"enctype="multipart/form-data"method="post"><divclass="form-group"id="group"><labelfor="exampleInputFile">File input</label><inputtype="file"id="exampleInputFile"name="file"/></div><buttontype="submit"class="btn btn-default"id="submit">上传</button></form></body></html>

8. 文件上传成功界面

为了看得文件上传的结果,我这里编写了一个文件上传成功后要跳转到的界面。

<!DOCTYPE html><htmlxmlns="http://www.w3.org/1999/xhtml"xmlns:th="http://www.thymeleaf.org"><head><metacharset="UTF-8"/><title>【文件上传成功页面】</title></head><body><divalign="center"><h5>上传成功</h5></div></body></html>

9. 编写入口类

最后我们编写一个项目的入口类,启动项目。

packagecom.yyg.boot;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplicationpublicclassOssApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(OssApplication.class, args);
    }
}

10. 进行测试

把项目启动起来进行测试,这里我们首先进入到文件上传界面,选择一个文件进行上传,正常情况下会发现文件上传成功的提示。

打开控制台,可以看到阿里云OSS服务器端返回的图片存储路径。

然后我们可以在阿里云服务器上,看到会自动以当天的日期创建的一个文件夹,这里存放的就是刚才上传的文件。

在这个文件夹里我们可以看到刚才上传的图片文件。

结语

至此,壹哥 就把阿里云OSS的使用给大家介绍完了,以后你可以把你的私密文件上传到自己的云服务器哦,这样就不用担心会被人盗走了,当然请一定要记得权限配置好,😋。

今天的内容你学会了吗?评论区告诉我吧!

今日小作业:

在自己的学生信息管理系统中,把自己的靓照上传存储的阿里云OSS里。

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
相关文章
|
7天前
|
存储 人工智能 Cloud Native
阿里云渠道商:OSS与传统存储系统的差异在哪里?
本文对比传统存储与云原生对象存储OSS的架构差异,涵盖性能、成本、扩展性等方面。OSS凭借高持久性、弹性扩容及与云服务深度集成,成为大数据与AI时代的优选方案。
|
3月前
|
存储 运维 安全
阿里云国际站OSS与自建存储的区别
阿里云国际站对象存储OSS提供海量、安全、低成本的云存储解决方案。相比自建存储,OSS具备易用性强、稳定性高、安全性好、成本更低等优势,支持无限扩展、自动冗余、多层防护及丰富增值服务,助力企业高效管理数据。
|
3月前
|
存储 域名解析 前端开发
震惊!不买服务器,还可以用阿里云国际站 OSS 轻松搭建静态网站
在数字化时代,利用阿里云国际站OSS可低成本搭建静态网站。本文详解OSS优势及步骤:创建Bucket、上传文件、配置首页与404页面、绑定域名等,助你快速上线个人或小型业务网站,操作简单,成本低廉,适合初学者与中小企业。
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
392 4
|
3月前
|
存储 安全 API
某网盘不好用?有没有类似某网盘的存储软件?阿里云国际站 OSS:云存储的全能助手,你 get 了吗?
在数据爆炸时代,阿里云国际站OSS提供海量、安全、低成本的云存储服务,支持多种数据类型存储与灵活访问,助力企业与个人高效管理数据,降低存储成本。开通简便,操作友好,是理想的云端数据解决方案。
|
5月前
|
存储 安全 前端开发
SpringBoot阿里云OSS文件上传实例
本文介绍了通过阿里云OSS实现用户头像上传的功能。首先概述了OSS的特点,如高持久性、RESTful API支持及多种存储类型。接着详细描述了前期准备步骤,包括注册阿里云账号、实名认证、开通OSS服务、创建Bucket及AccessKey。注意事项中提到需调整Bucket的访问权限以支持前端访问。最后提供了基于SpringBoot的代码实现,包含配置文件与上传工具类的编写,帮助开发者快速集成OSS文件上传功能。
1087 1
SpringBoot阿里云OSS文件上传实例
|
8月前
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
638 79
|
Cloud Native Java C++
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
文章介绍如何在Spring Boot 3中利用GraalVM将Java应用程序编译成独立的本机二进制文件,从而提高启动速度、减少内存占用,并实现不依赖JVM运行。
1488 1
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
|
9月前
|
SQL 分布式计算 Serverless
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
191 0
|
12月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。

热门文章

最新文章

下一篇
开通oss服务