功能实现——通过阿里云 OSS 实现文件管理

目录

  • 1.需求分析
  • 2.阿里云 OSS 开通与配置
    • 2.1.登录阿里云官网
    • 2.2.搜索 OSS 服务并开通
    • 2.3.OSS 配置
  • 3.在项目使用阿里云 OSS
    • 3.1.项目环境搭建
    • 3.2.代码实现
      • 3.2.1.将本地文件上传到阿里云 OSS
      • 3.2.2.将前端传入的文件上传到阿里云 OSS
      • 3.2.3.下载文件到本地
      • 2.3.4.流式下载
      • 3.2.4.OSSController.java
    • 3.3.测试
      • 3.3.1.上传本地文件到阿里云 OSS
      • 3.3.2.前端上传文件到阿里云 OSS
      • 3.3.3.下载文件到本地
      • 3.3.4.流式下载

参考:
阿里云 OSS 注册与使用
阿里云 OSS 官方文档

1.需求分析

目前需要在 Spring Boot 项目中通过阿里云 OSS 来实现文件管理,例如文件上传、下载等操作。

阿里云 OSS 指的是阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的一种高可用、高扩展性的云端存储服务。它允许用户通过网络随时存储和访问大量数据,适用于各种场景,如网站托管、大数据分析、备份与归档等。

2.阿里云 OSS 开通与配置

2.1.登录阿里云官网

进入阿里云官网页面并登录(未注册需要先点击页面右上角进行注册):

在这里插入图片描述

2.2.搜索 OSS 服务并开通

(1)在页面上方的搜索框中搜索“OSS”并点击进入:

在这里插入图片描述

(2)第一次使用的账户可以免费试用(下面以免费试用为例):

在这里插入图片描述

在这里插入图片描述

(3)免费试用的页面如下(相比于付费的,少了自定义配置的过程):

在这里插入图片描述

付费版的配置如下,大家可以根据自己的实际需求进行配置。

在这里插入图片描述

(4)提交成功后,点击管理试用可以查看详细信息。

在这里插入图片描述

2.3.OSS 配置

(1)申请试用(或者付费开通之后)回到之前的页面点击管理控制台:

在这里插入图片描述

(2)点击"Bucket 列表"进入页面:

在这里插入图片描述

(3)创建 Bucket:

在这里插入图片描述

根据自己的需求选择相应配置:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

查看 Bucket 中的文件:

在这里插入图片描述

初始时为空,即没有任何文件:

在这里插入图片描述

需要注意的是,上述配置只是为了满足本文的简单需求,因此在配置时并未开启其它功能(例如实时日志查询、定时备份等)。大家在配置时需要根据实际情况来选择。

3.在项目使用阿里云 OSS

更加详细的信息见阿里云 OSS 官方文档。

在这里插入图片描述

3.1.项目环境搭建

(1)在 IDEA 中创建一个 Spring Boot 项目,具体可以参考【环境搭建】使用IDEA创建SpringBoot项目详细步骤这篇文章。

(2)pom.xml 中添加如下依赖:

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>

如果使用的是 Java 9 及以上的版本,则需要添加 JAXB 相关依赖。添加 JAXB 相关依赖示例代码如下:

<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version>
</dependency>

(3)application.yml 中的配置如下:

aliyun:OSS:endpoint: https://oss-cn-beijing.aliyuncs.com	# 上面创建 Bucket 过程中出现的域名accessKeyId: *******************			    # 用于标识用户的密钥 ID,类似于用户名,获取方式见下面的介绍accessKeySecret: ******************  			# 用于对请求进行加密签名的密钥,类似于密码,获取方式见下面的介绍objectName: myDir/								# 存储空间中的文件存放地址,其中的 myDir 是我手动创建的空目录bucketName: test-oos-bucket						# bucket 名称

accessKeyIdaccessKeySecret 的获取方式:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

通过手机验证或者人脸验证后即可得到 accessKeyIdaccessKeySecret

在这里插入图片描述

3.2.代码实现

下面在 OSSUtil.java 工具类中封装相关方法:

package com.example.oss.util;import com.aliyun.oss.OSS;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.File;@Component
public class OSSUtil {//读取配置文件中的相关信息@Value("${aliyun.OSS.endpoint}")private String endpoint;@Value("${aliyun.OSS.accessKeyId}")private String accessKeyId;@Value("${aliyun.OSS.accessKeySecret}")private String accessKeySecret;@Value("${aliyun.OSS.objectName}")private String objectName;@Value("${aliyun.OSS.bucketName}")private String bucketName;//具体文件操作见下面的代码
}

3.2.1.将本地文件上传到阿里云 OSS

/*** @description 将本地文件上传到阿里云 OSS* @param filePath 本地的文件路径* @return 文件下载地址*/
public String uploadLocalFile(String filePath) {//创建 OSSClient 实例OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);File file = new File(filePath);// Object 完整路径,完整路径中不能包含 Bucket 名称,例如 myDir/output.pdfString objectNamePath = objectName + file.getName();try {//创建 PutObjectRequest 对象PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectNamePath, file);//如果需要上传时设置存储类型和访问权限,请参考以下示例代码。// ObjectMetadata metadata = new ObjectMetadata();// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());// metadata.setObjectAcl(CannedAccessControlList.Private);// putObjectRequest.setMetadata(metadata);//上传文件PutObjectResult result = ossClient.putObject(putObjectRequest);//设置 URL 过期时间为 1 小时Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);//生成文件的下载 URLString url = ossClient.generatePresignedUrl(bucketName, objectNamePath, expiration).toString();return url;} 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();}}return "null";
}

3.2.2.将前端传入的文件上传到阿里云 OSS

/*** @description 将前端传入所接收的文件上传到阿里云 OSS* @param file 前端传入所接收的文件* @param fileName 文件命名* @return 文件存储在云端的地址* @throws Exception*/
public String uploadFrontFile(MultipartFile file, String fileName) throws Exception {// myDir\output2.pdfString objectNamePath = objectName + fileName;//创建 OSSClient 实例OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {//创建 PutObjectRequest 对象PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectNamePath, file.getInputStream());//设置该属性可以返回 response,如果不设置,则返回的 response 为空putObjectRequest.setProcess("true");//创建 PutObject 请求PutObjectResult result = ossClient.putObject(putObjectRequest);//设置 URL 过期时间为 1 小时Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);//生成文件的下载 URLString url = ossClient.generatePresignedUrl(bucketName, objectNamePath, expiration).toString();return url;} 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();}}return "null";
}

3.2.3.下载文件到本地

/*** @description 将前端传入所接收的文件上传到阿里云 OSS* @param fileName 要下载的阿里云 OSS 上的文件名* @param downFilePath 下载到本地的完整路径* @return 下载成功标识*/
public String downloadFileToLocal(String fileName, String downFilePath) {// myDir\output.pdfString objectNamePath = objectName + fileName;//创建 OSSClient 实例OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {/*** 下载 Object 到本地文件,并保存到指定的本地路径中:* 1.如果指定的本地文件存在会覆盖,不存在则新建。* 2.如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。* */ossClient.getObject(new GetObjectRequest(bucketName, objectNamePath), new File(downFilePath));} 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();}}return "success";
}

2.3.4.流式下载

/*** @description 流式下载文件* @param fileName 要流式下载的文件名称* @return 文件内容*/
public String streamingDownload(String fileName) {// myDir\test.txtString objectNamePath = objectName + fileName;//创建 OSSClient 实例OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);StringBuilder builder = new StringBuilder();try {// ossObject 包含文件所在的存储空间名称、文件名称、文件元数据以及一个输入流OSSObject ossObject = ossClient.getObject(bucketName, objectNamePath);//读取文件内容System.out.println("Object content:");BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));while (true) {String line = reader.readLine();if (line == null) {break;}System.out.println("\n" + line);builder.append("\n").append(line);}//数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作reader.close();//ossObject 对象使用完毕后必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作ossObject.close();} 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 (Throwable 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();}}return builder.toString();
}

3.2.4.OSSController.java

package com.example.oss.controller;import com.example.oss.util.OSSUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;@RestController
@RequestMapping("/oss")
public class OSSController {@Autowiredprivate OSSUtil ossUtil;//上传本地文件@PostMapping("/uploadLocalFile")public String uploadLocalFile() {String filePath = "output.pdf";return ossUtil.uploadLocalFile(filePath);}//上传前端文件@PostMapping("/uploadFrontFile")public String uploadFrontFile(MultipartFile file) throws Exception {String fileName = "output2.pdf";return ossUtil.uploadFrontFile(file, fileName);}//下载文件到本地@PostMapping("/downloadFileToLocal")public String downloadFileToLocal() {String fileName = "output.pdf";String downFilePath = "D:\\output.pdf";return ossUtil.downloadFileToLocal(fileName, downFilePath);}//流式下载@PostMapping("/streamingDownload")public String streamingDownload() {String fileName = "test.txt";return ossUtil.streamingDownload(fileName);}
}

3.3.测试

3.3.1.上传本地文件到阿里云 OSS

启动项目后,在 Postman 中进行接口测试(注意是 POST 请求),并返回了该文件的下载 URL:

http://localhost:8080/oss/uploadLocalFile

在这里插入图片描述

此时在 OSS 控制台可以发现已经成功上传了文件 output.pdf,它在目录 myDir/ 下:

在这里插入图片描述

3.3.2.前端上传文件到阿里云 OSS

启动项目后,在 Postman 中进行接口测试(注意是 POST 请求),注意设置请求头中的 Content-Typemultipart/form-data

http://localhost:8080/oss/uploadFrontFile

在这里插入图片描述

在这里插入图片描述

此时在 OSS 控制台可以发现已经成功上传了文件 output2.pdf,它也在目录 myDir/ 下:

在这里插入图片描述

3.3.3.下载文件到本地

启动项目后,在 Postman 中进行接口测试(注意是 POST 请求):

http://localhost:8080/oss/downloadFileToLocal

在这里插入图片描述

此时本地的 D 盘中也有了刚才下载的文件:

在这里插入图片描述

3.3.4.流式下载

考虑到 PDF 文件的读取内容可能为乱码,因此我先上传 test.txt 文件到阿里云 OSS ,其内容如下:

hello world!
你好!

在这里插入图片描述

启动项目后,在 Postman 中进行接口测试(注意是 POST 请求):

http://localhost:8080/oss/streamingDownload

在这里插入图片描述

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

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

相关文章

本地部署文生图模型 Flux

本地部署文生图模型 Flux 0. 引言1. 本地部署1-1. 创建虚拟环境1-2. 安装依赖模块1-3. 创建 Web UI1-4. 启动 Web UI1-5. 访问 Web UI 0. 引言 2024年8月1日&#xff0c;blackforestlabs.ai发布了 FLUX.1 模型套件。 FLUX.1 文本到图像模型套件&#xff0c;该套件定义了文本到…

【收录率高丨最快会后3-4个月EI检索 | 往届均已EI检索】第四届光学与通信技术国际学术会议(ICOCT 2024,8月9-11)

欢迎参加第四届光学与通信技术国际学术会议&#xff08;ICOCT 2024&#xff09;&#xff0c;该会议将于2024年8月9-11日在南京举办。自2021年首次会议以来&#xff0c;ICOCT已经发展成为光学和通信领域较有影响力的国际会议之一&#xff0c;聚焦最前沿的技术进展与未来发展趋势…

【Redis 进阶】哨兵 Sentinel(重点理解流程和原理)

Redis 的主从复制模式下&#xff0c;一旦主节点由于故障不能提供服务&#xff0c;需要人工进行主从切换&#xff0c;同时大量的客户端需要被通知切换到新的主节点上&#xff0c;对于上了一定规模的应用来说&#xff0c;这种方案是无法接受的&#xff0c;于是 Redis 从 2.8 开始…

“八股文“在现代编程面试中的角色重塑:助力、阻力还是桥梁?

&#x1f308;所属专栏&#xff1a;【其它】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…

AI人工智能开发环境配置

AI人工智能 为什么使用Python来开发AI 人工智能被认为是未来的趋势技术。 已经有了许多应用程序。 因此&#xff0c;许多公司和研究人员都对此感兴趣。 但是这里出现的主要问题是&#xff0c;在哪种编程语言中可以开发这些 AI 应用程序&#xff1f; 有各种编程语言&#xff0c…

Python 实现股票指标计算——LON

LON - 铁龙长线 1 公式 LC : REF(CLOSE,1); VID : SUM(VOL,2)/(((HHV(HIGH,2)-LLV(LOW,2)))*100); RC : (CLOSE-LC)*VID; LONG : SUM(RC,0); DIFF : SMA(LONG,10,1); DEA : SMA(LONG,20,1); LON : DIFF-DEA; LONMA : MA(LON,10); LONT : LON, COLORSTICK; 2 数据准备…

练题模块环境搭建

文章目录 1.数据库表设计1.practice_set 套卷2.practice_set_detail 套卷细节3.practice_info 练习信息4.practice_detail 练习详情5.E-R图 2.架构设计&#xff08;三层架构&#xff09;3.练题微服务架构搭建1.创建一个练题微服务模块1.创建一个maven项目2.把src删除&#xff0…

Halcon 二维匹配

匹配&#xff1a;在训练图像中呈现一个所谓的模板。系统从这个模板中派生出一个模型&#xff0c;通过使用该模型来定位于搜索图像中的相似模板对象。此方法能够处理打光、杂乱、位置和旋转变换的图像。 匹配优点&#xff1a;鲁棒性和灵活性。匹配不需要对目标进行任何形式的分割…

假期BUUCTF小练习3

文章目录 [极客大挑战 2019]BuyFlag[BJDCTF2020]Easy MD5[HCTF 2018]admin第一种方法 直接登录第二种方法 flack session伪造第三种方法Unicode欺骗 [MRCTF2020]你传你&#x1f40e;呢[护网杯 2018]easy_tornadoSSTI注入 [ZJCTF 2019]NiZhuanSiWei [极客大挑战 2019]BuyFlag 一…

vmware虚拟机linux服务器的IP需要重启才能生效问题

vmware虚拟机linux服务器的IP需要重启才能生效问题 问题说明处理办法关闭&禁用网络管理 再次重启linux服务器&#xff0c;IP显示正常 问题说明 用vmware虚拟的linux服务器&#xff0c;配置了静态IP&#xff0c;但是每次重启liunx&#xff0c;IP都不是设置的静态IP&#xf…

[GWCTF 2019]我有一个数据库1

打开题目&#xff0c;一串乱码&#xff0c;不认识的汉字 打开题目地址&#xff0c;用dirsearch对网站进行扫描&#xff0c;发现几个目录。 打开&#xff0c;其中一个显示为是一个MySQL数据库Version 4.8.1。 发现该数据给具有文件包含漏洞&#xff0c;输入以下代码验证存在 h…

java面向对象编程入门

一、前言&#xff1a; 在Java中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;是一种核心的编程范式。Java的设计和开发都是基于面向对象的思想。面向对象编程的主要目的是提高代码的可重用性、灵活性和可维护性。以下是Java面向对象编程…

Neutralinojs教程项目实战初体验(踩坑指南),干翻 electron

Neutralinojs 项目实战初体验&#xff08;踩坑指南&#xff09;&#xff0c;干翻 electron 大家好我是csdn的red润 Neutralinojs 官方文档 卧槽卧槽&#xff0c;&#xff01;这个年轻人居然用浏览器把电脑关机了_哔哩哔哩_bilibili正是在下 本教程搭建的是纯原生项目&#x…

LeetCode每日一题_3143.正方形中的最多点数

解题思路&#xff1a;自己&#xff1a;先把points里的点拿来求出坐标系的离原点最远的点&#xff0c;然后根据最远距离新建一个数组&#xff0c;然后把points的点都在新建的数组上标记出来。然后再便利从边长为0的正方形开始&#xff0c;里面是否有重复的标签。但是代码写不出来…

vulhub-wordpress

1.打开wordpress关卡&#xff0c;选择简体中文 添加信息——点击安装WordPress 安装完成——登录 点击外观——编辑主题 可以加入一句话木马&#xff0c;但是我写入的是探针文件 也可以去上传一个带有木马的主题 上传之后会自动解压 1.php就是里面的木马文件

数据结构与算法 - 堆

1. 建堆 Floyd建堆算法作者&#xff08;也是之前龟兔赛跑判环作者&#xff09;&#xff1a; ①找到最后一个非叶子节点②从后往前&#xff0c;对每个节点执行下潜 一些规律 一棵满二叉树节点个数为2^h - 1&#xff0c;如下例中高度h 3节点数是2 ^ 3 - 1 7非叶子节点范围为…

PMP--冲刺--敏捷中的角色职责与3个工件--题干关键词

文章目录 敏 捷 中 的 角 色 职 责 与 3 个 工 件--题干关键词说明题目 敏 捷 中 的 角 色 职 责 与 3 个 工 件–题干关键词 角色职责 1、产品负责人&#xff1a;题干关键词 “优先级排序、与客户沟通、下次迭代做什么、接受或拒绝用户故事”。 2、Scrum Master&#xff1a;题…

uniapp自定义网格布局用于选择金额、输入框焦点事件以及点击逻辑实战

样式 <view class="withdraw-section"><text class="section-title">提现金额</text><view class="amount-options"><view v-for="(item, index) in list" :key="index" class="amount-opt…

学习Java的日子 Day59 学生管理系统 web1.0版本

Day59 学生管理系统 web1.0 1.项目需求 有两个角色&#xff0c;老师和学生&#xff0c;相同的功能提取到父类用户角色 2.数据库搭建 设计学生表 设计老师表 插入数据 (超级管理员) 设计学科表 3.项目搭建 处理基础页面&#xff0c;分包&#xff0c;实体类&#xff0c;导入数据…

【初学人工智能原理】【12】循环:序列依赖问题

前言 本文教程均来自b站【小白也能听懂的人工智能原理】&#xff0c;感兴趣的可自行到b站观看。 代码及工具箱 本专栏的代码和工具函数已经上传到GitHub&#xff1a;1571859588/xiaobai_AI: 零基础入门人工智能 (github.com)&#xff0c;可以找到对应课程的代码 正文 对于…