当前位置: 首页 > backend >正文

SpringBoot上传文件到阿里云OSS对象存储

文章目录

  • 一、阿里云创建OSS
    • 创建账号(省略)
    • 开通对象存储服务,创建bucket
    • 关闭阻止公共访问
    • 修改读写权限为公共读(因为我是演示环境)
    • 获取AccessKey(秘钥)
    • 参照官方SDK文档
  • 二、编写代码
    • pom.xml引入oss起步依赖
    • 单元测试
    • 创建工具类
    • 控制层
  • 三、参考资料


一、阿里云创建OSS

可以免费使用3个月

创建账号(省略)

开通对象存储服务,创建bucket

点击右上角控制台
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关闭阻止公共访问

在这里插入图片描述
在这里插入图片描述

修改读写权限为公共读(因为我是演示环境)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

获取AccessKey(秘钥)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建成功后,保存ID和Secret
在这里插入图片描述

参照官方SDK文档

在这里插入图片描述
左侧拉到最下面
在这里插入图片描述
打开帮助文档
在这里插入图片描述
在这里插入图片描述

二、编写代码

pom.xml引入oss起步依赖

<!--阿里云oss坐标-->
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version></dependency>
<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>

单元测试

参考官方文档
在这里插入图片描述
获取endpoint
在这里插入图片描述
在这里插入图片描述
Demo.java
在这里插入图片描述

package com.itheima;import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.aliyuncs.auth.StaticCredentialsProvider;import java.io.ByteArrayInputStream;
import java.io.FileInputStream;public class Demo {public static void main(String[] args) throws Exception {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "https://oss-cn-shenzhen.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
//        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();//获取AccessKey(秘钥)的值String ACCESS_KEY_ID = "LAI5t61RVvo4abxK3dY6Q";String ACCESS_KEY_SECRET = "lpw37mdszKd9Nc9b2jKXkroocLy";// 填写Bucket名称,例如examplebucket。String bucketName = "big-event-aqx";// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。String objectName = "001.png";// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。String region = "cn-shenzhen";// 创建OSSClient实例。
//        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
//        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
//        OSS ossClient = OSSClientBuilder.create()
//                .endpoint(endpoint)
//                .credentialsProvider(new StaticCredentialsProvider(new BasicCredentials(ACCESS_KEY_ID, ACCESS_KEY_SECRET)))
//                .clientConfiguration(clientBuilderConfiguration)
//                .region(region)
//                .build();OSS ossClient = new OSSClientBuilder().build(endpoint, ACCESS_KEY_ID, ACCESS_KEY_SECRET);try {// 填写字符串。String content = "Hello OSS,你好世界";// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new FileInputStream("C:\\Users\\devops\\Desktop\\files\\001.png"));// 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。// 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);} 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();}}}
}

创建工具类

utils/AliOssUtil.java

package com.itheima.utils;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.InputStream;public class AliOssUtil {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。private static final String ENDPOINT = "https://oss-cn-shenzhen.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
//        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();//获取AccessKey(秘钥)的值private static final String ACCESS_KEY_ID = "5t61RVvo4abxK3dY";private static final String ACCESS_KEY_SECRET = "w37mdszKd9Nc9b2jKX";// 填写Bucket名称,例如examplebucket。private static final String BUCKETNAME = "big-event-aqx";// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
//    String region = "cn-shenzhen";public static String uploadFile(String objectName, InputStream in) throws Exception {OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);String url = "https://"+BUCKETNAME+"."+ENDPOINT.substring(ENDPOINT.lastIndexOf("/")+1)+"/"+objectName;try {// 填写字符串。String content = "Hello OSS,你好世界";// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKETNAME, objectName, in);// 上传字符串。PutObjectResult result = ossClient.putObject(putObjectRequest);} 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 url;}
}

控制层

controller/FileUploadController.java

package com.itheima.controller;import com.itheima.pojo.Result;
import com.itheima.utils.AliOssUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@RestController
public class FileUploadController {@PostMapping("/upload")public Result<String> upload(MultipartFile file) throws Exception {//把文件内容存储到本地磁盘String originalFileName = file.getOriginalFilename();//用uuid保证文件名唯一String fileName = UUID.randomUUID().toString()+originalFileName.substring(originalFileName.lastIndexOf("."));
//        file.transferTo(new File("C:\\Users\\devops\\Desktop\\files\\" + fileName));String url = AliOssUtil.uploadFile(fileName,file.getInputStream());return Result.success(url);}
}

三、参考资料

https://www.bilibili.com/video/BV14z4y1N7pg?spm_id_from=333.788.player.switch&vd_source=0467ab39cc5ec5940fee22a0e7797575&p=38

http://www.xdnf.cn/news/3750.html

相关文章:

  • 数据赋能(211)——质量管理——数据可验证性原则
  • 【Mytais系列】介绍、核心概念
  • 【浅学】Windows下ffmpeg+nginx+flv将本地视频推流在本地搭建的Web前端页面中播放,超详细步骤
  • C++ 抽象工厂模式详解
  • [Vue]编程式导航
  • C++ 单例模式详解
  • React18组件通信与插槽
  • 数模竞赛的坑,你踩了几个?
  • 源码编译Qt StateMachine
  • 如何在 CentOS 7 命令行连接 Wi-Fi?如何在 Linux 命令行连接 Wi-Fi?
  • 力扣面试150题--二叉树的最大深度
  • 最大子段和 Java
  • 【计算机网络-应用层】解析HTTP会话保持:Cookie与Session的原理与实践
  • 学习黑客网络安全法
  • 26考研 | 王道 | 计算机网络 | 第三章 数据链路层
  • 第一章 初识SpringMVC
  • RUST变量学习笔记
  • 命令模式(Command Pattern)详解
  • 使用 Lux Algo + ATR Zones + IIIX 的黄金剥头皮策略(2025 年更新)
  • 抽象工厂模式(Abstract Factory Pattern)
  • c++26新功能——gcc15.1的支持
  • 第1章 Python 解释器安装(Anaconda/Pyenv 推荐)
  • 生成式 AI 的重要性
  • 第6章 Python 基本数据类型详解(int, float, bool, str)细节补充
  • GPU平台-优云智算
  • 机器学习中的分类和回归问题
  • thonny提示自动补全功能
  • 《Qt C++ 项目中升级 GCC 版本的完整指南》
  • 用Suno V4.5试了一下1850字的歌词进行创作出来了6分钟的歌曲
  • Unity基础学习(四)生命周期函数