后端Java学习:springboot之文件上传(阿里云OSS存储)

一、什么是阿里云存储?

阿里云对象存储OSS(Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

二、阿里云存储的特点和功能

  1. 海量存储:支持无限量的数据存储,适合各种规模的企业和个人用户。

  2. 高可用性:数据存储在多个数据中心,提供99.999999999%(11个9)的数据持久性。

  3. 安全性:提供多种安全机制,包括数据加密、访问控制和身份验证等,确保用户数据的安全。

  4. 高性能:支持大并发读写,能够快速响应用户请求。

  5. 灵活计费:根据存储空间和流量使用情况进行计费,适合不同需求的用户。

  6. 丰富的API:支持RESTful API,方便开发者集成和使用。

  7. 多种存储类型:提供标准存储、低频存储和归档存储等不同存储类型,满足不同访问频率的数据需求。

  8. 数据管理:支持生命周期管理、版本管理和数据迁移等功能,方便用户管理存储的数据。

三、springboot文件上传

1.为什么要使用阿里云OSS对象存储

在我们使用了阿里云OSS对象存储服务之后,我们的项目当中如果涉及到文件上传这样的业务,在前端进行文件上传并请求到服务端时,在服务器本地磁盘当中就不需要再来存储文件了。我们直接将接收到的文件上传到oss,由 oss帮我们存储和管理,同时阿里云的oss存储服务还保障了我们所存储内容的安全可靠。

2.进行准备工作(注册阿里云账户,并创建阿里云oss对象实例)

1.注册阿里云账户(注册完成后需要实名认证)

2.注册完账号之后,就可以登录阿里云

 

3.通过控制台找到对象存储OSS服务

如果是第一次访问,还需要开通对象存储服务OSS  

 

 

4.开通OSS服务之后,就可以进入到阿里云对象存储的控制台

 5.点击左侧的 "Bucket列表",创建一个Bucket

创建

3.编写入门程序

首先我们需要来打开阿里云OSS的官方文档,在官方文档中找到 SDK 的示例代码:

参照官方提供的SDK,改造一下,即可实现文件上传功能:

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;import java.io.FileInputStream;
import java.io.InputStream;public class AliOssTest {public static void main(String[] args) throws Exception {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "oss-cn-shanghai.aliyuncs.com";// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。String accessKeyId = "LTAI5t9MZK8iq5T2Av5GLDxX";String accessKeySecret = "C0IrHzKZGKqU8S7YQcevcotD3Zd5Tc";// 填写Bucket名称,例如examplebucket。String bucketName = "web-framework01";// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。String objectName = "1.jpg";// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。String filePath= "C:\\Users\\Administrator\\Pictures\\1.jpg";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {InputStream inputStream = new FileInputStream(filePath);// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);// 设置该属性可以返回response。如果不设置,则返回的response为空。putObjectRequest.setProcess("true");// 创建PutObject请求。PutObjectResult result = ossClient.putObject(putObjectRequest);// 如果上传成功,则返回200。System.out.println(result.getResponse().getStatusCode());} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}}
}

在以上代码中,需要替换的内容为:

  • accessKeyId:阿里云账号AccessKey

  • accessKeySecret:阿里云账号AccessKey对应的秘钥

  • bucketName:Bucket名称

  • objectName:对象名称,在Bucket中存储的对象的名称

  • filePath:文件路径

AccessKey :

 运行以上程序后,会把本地的文件上传到阿里云OSS服务器上:

4.集成代码

阿里云oss对象存储服务的准备工作以及入门程序我们都已经完成了,接下来我们就需要在案例当中集成oss对象存储服务,来存储和管理案例中上传的图片。

引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;@Component
public class AliOSSUtils {private String endpoint = "https://oss-cn-shanghai.aliyuncs.com";private String accessKeyId = "LTAI5t9MZK8iq5T2Av5GLDxX";private String accessKeySecret = "C0IrHzKZGKqU8S7YQcevcotD3Zd5Tc";private String bucketName = "web-framework01";/*** 实现上传图片到OSS*/public String upload(MultipartFile multipartFile) throws IOException {// 获取上传的文件的输入流InputStream inputStream = multipartFile.getInputStream();// 避免文件覆盖String originalFilename = multipartFile.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上传文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//文件访问路径String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;// 关闭ossClientossClient.shutdown();return url;// 把上传到oss的路径返回}
}

修改UploadController代码:

import com.itheima.pojo.Result;
import com.itheima.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;@Slf4j
@RestController
public class UploadController {@Autowiredprivate AliOSSUtils aliOSSUtils;@PostMapping("/upload")public Result upload(MultipartFile image) throws IOException {//调用阿里云OSS工具类,将上传上来的文件存入阿里云String url = aliOSSUtils.upload(image);//将图片上传完成后的url返回,用于浏览器回显展示return Result.success(url);}}

使用postman测试:

这样就成功上传图片啦,data返回的就是图片的数据。

四、总结

在Spring Boot中实现文件上传功能需要配置项目依赖、创建控制器处理文件上传请求、设置文件大小限制、编写HTML表单供用户选择文件,并确保存储目录存在。启动应用后,可以通过访问上传表单进行测试,同时要注意文件类型检查和异常处理,以提升安全性和用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当下的力量:拥抱自我与持续学习的旅程

许多人被无尽的选择与信息所淹没,常常感到迷茫与焦虑。然而,真正的力量来自于对当下的专注,以及对自我的深刻理解与不断提升。如何在喧嚣中找到内心的宁静?如何在复杂的世界中坚持学习与成长?这不仅是一个时代的问题&a…

【android12】【AHandler】【3.AHandler原理篇AHandler类方法全解】

AHandler系列 【android12】【AHandler】【1.AHandler异步无回复消息原理篇】-CSDN博客 【android12】【AHandler】【2.AHandler异步回复消息原理篇】-CSDN博客 其他系列 本人系列文章-CSDN博客 1.简介 前面两篇我们主要介绍了有回复和无回复的消息的使用方法和源码解析&a…

GPRS是什么?

‌GPRS(General Packet Radio Service)‌是一种基于GSM(Global System for Mobile Communications)系统的无线分组交换技术,提供端到端的广域无线IP连接。与传统的GSM系统不同,GPRS采用分组交换技术&#x…

flutter 专题二 Flutter状态管理之Riverpod 0.8.4

一 、flutter 有哪些状态管理方式 Flutter的状态管理方式有很多,Redux、 Bloc、 MobX、Provider等等。单单一个Provider,我也见到了各种组合,例如ChangeNotifier Provider / StateNotifier Provider( freezed)。各…

海风里的青春:海滨学院班级回忆录开发

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

ts:用加减乘除方法配合展示类的继承(extends)

ts:用加减乘除方法配合展示类的继承(extends) 1 主要内容说明2 例子2.1 基类的创建2.1.1 源码1 (基类的创建)2.1.2 源码1运行效果 2.2 继承基类的参数和方法2.2.1 源码2(继承基类的参数和方法)2…

Minio 之 内网项目托管Unity Android包体

什么是 MinIO? MinIO 是一个开源的对象存储服务器,旨在提供高性能、高可用性和高扩展性的存储解决方案。它兼容 Amazon S3 API,适用于各种场景,如数据备份、数据归档、大数据分析和机器学习等。 主要特点 兼容性: Mi…

Java中的容器及其区别

|Collection |  ├List |  │-├LinkedList |  │-├ArrayList |  │-└Vector |  │ └Stack |  ├Set |  │├HashSet |  │├TreeSet |  │└LinkedSet | |Map   ├Hashtable   ├HashMap   └WeakHashMap 1、Java中的容器 Java容器类…

论文阅读- --DeepI2P:通过深度分类进行图像到点云配准

目前存在的问题: 单模态配准具有局限性,多模态研究很少跨模态图像到点云配准问题是求解相机坐标系与点云之间的旋转矩阵R ∈ SO(3)和平移向量t ∈ R3。 这个问题很困难,因为由于缺乏点到像素的对应关系,无法使用 ICP、PnP 和捆绑调…

大厂面试真题-如果使用guava limiter实现实例级别的缓存

Guava库中的RateLimiter和Cache是两个不同的组件,分别用于控制访问频率和实现缓存功能。RateLimiter用于流量控制,确保系统在处理请求时不会超过指定的速率,而Cache则用于存储数据以加快访问速度。 由于RateLimiter本身并不直接支持实现缓存…

Air780E如何发送SMS?一文详解!

今天一起来学习使用合宙低功耗4G模组Air780E发送SMS短消息: 一、SMS简介 SMS(短消息服务,ShortMessageService)功能主要用于在蜂窝网络中传输短消息。 在4G网络中,短信可以在数据传输的同时进行,不会因数…

【TC3xx芯片】TC3xx芯片PFlash的ECC校验问题补充

目录 前言 正文 1.PFlash的ECC监控l 1.1. PFlash的监控使能 1.2. PFlash的故障注入 2.DFlash的ECC监控 2.1. DF0 ECC Read Register 2.2. DF0 ECC Status Register 2.3. DF0 ECC Control Register 2.4. DF0 ECC Write Register 2.5. DF0 User Mode Control 3.总结 …

Centos 7系统一键安装宝塔教程

服务器推荐青鸟云服务器,2H2G低至16元/月 官网地址: 所有产品_香港轻量云 2核 2G-A型_青鸟云 推荐Finalshell软件连接至服务器,下载地址: https://dl.hostbuf.com/finalshell3/finalshell_windows_x64.exe 下载完成后连接服务…

知识吾爱纯净版小程序系统 leibiao SQL注入漏洞复现(XVE-2024-30663)

0x01 产品简介 知识吾爱纯净版小程序系统是一款基于微信小程序平台开发的知识付费应用,旨在帮助用户快速建立自己的知识付费平台,实现支付变现和流量主收益。它提供了简洁明了的用户界面和良好的用户体验,同时注重用户隐私保护,确保用户信息的安全存储和传输。 0x02 漏洞…

HTML前端页面设计静态网站

浅浅分享一下前端作业&#xff0c;大佬轻喷~ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>一个网…

各大自媒体平台的感受 —— 小红书

如果你有些内容&#xff0c;想发布到自媒体平台上&#xff0c;目前有很多平台可用选择。 发布自媒体在获得关注的同时&#xff0c;同时也会期望有些收益。 我们的内容也发布了不少时间了&#xff0c;那就分别扒下各大自媒体平台的吃相&#xff0c;这篇文章说的是小红书。 收…

openEuler下配置openGauss环境图解

一、在openEuler中创建用户&#xff0c;并授予权限 # 创建用户 sudo adduser omm# 授予权限 chown omm /opt# 切换用户 su - omm 二、在openGauss官网找到openGauss极简版的软件包 openGauss软件 | openGauss下载 | openGauss软件包 | openGauss社区 右键立即下载&#xff0…

RabbitMQ 的集群

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ 的集群】面试题&#xff1f;希望对大家有帮助&#xff1b; RabbitMQ 的集群 RabbitMQ 是一种流行的开源消息代理&#xff0c;广泛用于构建分布式系统中的消息队列。随着应用程序规模的扩大&#xff0c;单一的 RabbitMQ 实…

[ 应急响应基础篇 ] Windows 写入任务计划程序详解--任务计划程序窗口写入 命令行写入

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

flinksql-Queries查询相关实战

分组聚合 --分组集 --GROUPING SETS() 允许你定义特定的分组方式&#xff0c;这样你可以选择只对感兴趣的分组进行计算。 --通过手动指定不同的分组组合&#xff0c;你能够灵活地控制数据的聚合结果。 --与 ROLLUP 和 CUBE 不同&#xff0c;GROUPING SETS 不会自动生成所有子集…