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

news2024/11/16 22:17:15

目录

  • 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.pdf
    String 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);
        //生成文件的下载 URL
        String 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.pdf
    String 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);
        //生成文件的下载 URL
        String 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.pdf
    String 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.txt
    String 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 {

    @Autowired
    private 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.coloradmin.cn/o/1975227.html

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

相关文章

携程酒店、景点、评论数据采集,testab动态js加密参数处理不补js环境不纯算

携程平台的酒店、景点、评价数据还是比较有意义的&#xff0c;可用作数据分析研究&#xff0c;目前均可采集。酒店价格需要登录采集&#xff0c;其他店名、地址、经纬度、评分、评价数、特色标签等都可以直接采集。 携程酒店数据示例&#xff1a; 酒店id&#xff1a;536424 …

免费【2024】springboot 大学生在线论坛系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

常用配置文件 .ini、.config、 json、xml

ini Initialization INI文件格式是某些平台或软件上的配置文件的非正式标准&#xff0c;以节(section)和键值对(key-val)构成&#xff0c;常用于微软Windows操作系统中。 这种配置文件的文件扩展名多为INI 》》INI文件不支持数据类型&#xff0c;所有的键值对都是字符串类型…

[SQLSERVER][SQL]数据库备份任务异常

SQL备份异常出现如下错误&#xff1a; 执行查询“BACKUP DATABASE [ReportServerTempDB] TO DISK N...”失败&#xff0c; 执行查询“BACKUP DATABASE [ReportServerTempDB] TO DISK N...”失败&#xff0c; 错误如下:“无法打开备份设备 E:\\sqldatabackup19\\Report_ba…

nose2,一个无敌的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个无敌的 Python 库 - nose2。 Github地址&#xff1a;https://github.com/nose-devs/nose2 在软件开发过程中&#xff0c;自动化测试是保证代码质量的重要环节。Python 提供…

Python(模块)

模块编写完成就可以被其他模块进行调用并使用被调用模块的功能。 import导入方式的语法结构&#xff1a; import模块名称【as别名】 from……import导入方式的语法结构&#xff1a; from模块名称&#xff0c;import变量/函数/类/*&#xff08;*是通配符&#xff09; impor…

非线性磁链观测器

前面已经介绍了龙伯格观测器、滑膜观测器&#xff1a;龙伯格观测器&#xff08;又称状态观测器&#xff09;、滑膜观测器-CSDN博客 滑膜观测器和龙伯格观测器都是没法实现电机的超低速运转、0速启动、超高速的正反方向的运行。龙伯格观测器是可以实现这些功能&#xff0c;但是…

Resolving Maven dependencies

Maven是一种项目管理和构建工具&#xff0c;通常用于Java项目。这个过程包括下载项目所需的所有外部库和插件&#xff0c;并将它们添加到项目的构建路径中。具体来说&#xff0c;它正在处理名为“AAS_byBasyx”的项目或模块的依赖项。这种任务通常在你打开一个新的Maven项目或更…

基于web的购物网站的设计与实现(系统源码+lw+部署文档+讲解等)

文字目录&#xff1a; 目录 详细视频演示 系统实现界面 1.1系统开发环境以及运行环境 1.1.1系统开发环境 1.1.2系统运行环境 1.2系统功能实现 1.3管理员模块实现 2 技术介绍 2.1 thinkphp5介绍 2.2 MySQL数据库 2.3 B/S结构 4.1系统结构设计 4.2系统功能结构设计…

​JavaWeb入门——Servlet(二)

目录 HttpServletRequest 简介 常见API HttpServletResponse 简介 常见API 请求转发和响应重定向 概述 请求转发 响应重定向 cookie&session 会话 会话跟踪方案&#xff1a; 会话跟踪方案对比&#xff1a; 1、Cookie 2、Session&#xff08;底层基于Cookie…

RocketMQ5.0消费者

RocketMQ 5.0 提供了三种主要的消费者类型&#xff1a;PushConsumer、SimpleConsumer 和 PullConsumer。每种类型的消费者都有其特定的使用场景和特点。以下是对这三种消费者的概念及其区别的详细阐述&#xff1a; PushConsumer 概念&#xff1a; PushConsumer 是一种主动推送…

Python time模块5大隐藏特性

特性一&#xff1a;结构化时间——struct_time 简介&#xff1a; struct_time是time模块中的一个数据类型&#xff0c;用于存储一个时间的各个组成部分&#xff08;年、月、日、时、分、秒等&#xff09;。它常用于解析和格式化时间。 代码示例&#xff1a; import time # …

GA4(Google Analytics 4 )升级指南丨出海笔记

Google Analytics 4 是与之前的Universal Analytics/GA3完全不同的全新版本&#xff0c;2023下半年(7月后)会全面替换UA。 本篇指南将会展示如何安装和使用 Google Analytics 4 (GA4), 以便大家更好的迁移并使用新平台。相比GA3, GA4绝对是好东西&#xff0c;这次的内容比较硬核…

Linux基于centOS7【内存与OS的随谈】,进程初学【PCB】【fork】【进程排队】

冯诺依曼体系结构——存储器 存储器主要指的是内存&#xff0c;它有个特点就是掉电易失 磁盘等其它输入和输出设备 为什么要在计算机体系结构中要存在内存 我们知道&#xff0c;CPU的处理速度很快很快&#xff0c;但输入设备&#xff0c;以及输出设备&#xff0c;是相对很慢的…

C#对Sqllite操作

前言 数据库的操作也是程序设计中的家常便饭了&#xff0c;关系型数据库中Sqlite3是非常轻量级别的&#xff0c;所以这个数据在小型应用程序的设计中占用很高的比重。当然我这里描述的是1.0版本&#xff0c;也是最原始的方案&#xff0c;大型应用开发中一般选择EF进行桥接&…

信息学奥赛初赛天天练-54-CSP-J2019阅读程序3-二叉树、满二叉树、单侧二叉树、二分查找、递归、等差数列求和

PDF文档公众号回复关键字:20240803 2019 CSP-J 阅读程序3 1阅读程序(程序输入不超过数组或字符串定义的范围&#xff1b;判断题正确填 √&#xff0c;错误填 。除特殊说明外&#xff0c;判断题 1.5 分&#xff0c;选择题 3 分&#xff0c;共计 40 分) 01 #include <iostre…

idea项目创建提交到gitee gitee创建仓库 gitee删除仓库(全网最新最详细)

一、gitee创建仓库 1.如下图 2.创建好后如下图 3.打开idea创建好项目 3.1点击终端 3.2 从gitee页面复制命令进行运行 具体步骤如下图&#xff1a; 在步骤5时可能会提醒你远程仓库没有main分支&#xff0c;这个时候需要执行下图中的命令4创建一个远程main分支 结果运行如下图…

GATK ReferenceDataSource接口介绍

在 GATK(Genome Analysis Toolkit)库中,ReferenceDataSource 接口是一个重要的接口,用于表示与参考基因组相关的数据源。它提供了一种标准化的方式来访问和操作参考基因组的不同来源的数据。ReferenceMemorySource 类和ReferenceFileSource 类是ReferenceDataSource接口的实…

给本地设备搭建一个云端语音助手

概述 本语音助手实现了从关键词唤醒 (KWS) 到语音识别 (ASR) 再到自然语言理解 (NLU) 的完整流程。该系统可以通过监听用户的音频输入,检测指定的关键词,并将用户的语音转换为文本,最后与预设的命令进行匹配,执行相应的操作(具体实现请参考main.py),为你的设备配置远程…

ASPCMS

1.后台修改配置文件拿Shell 步骤一&#xff1a;访问以下地址为ASPCMS...并登陆到后台&#xff08;这里注意在搭建站点的时候注意权限问题&#xff09; #网站后台 http://192.168.4.139/admin_aspcms/login.asp //全功能版本 #账户密码 username:admin password:123456 步骤二…