阿里云OSS文件上传_对象存储服务全流程
目录
0. OSS是什么
1. 使用对象存储服务的好处:
2. 典型使用场景
3. 接入服务全步骤_阿里云OSS
3.1 进入阿里云
3.2 登录
3.3 选择对象存储OSS
3.4 进入Bucket列表
3.5 创建Bucket, 输入名称并点击创建。
3.6 设置权限
3.6.1 关闭 阻止公共访问
3.6.2 设置读写权限为公有读
3.7 鼠标划到头像, 获取AccessKey
3.7.1 保存id和密钥到桌面txt文件里面
4. 如何使用
4.1 点击SDK下载,并点击SDK示例, 文档中心打开, 查看文档
4.2 选择JAVA, 根据文档示例实操
4.3 导入pom依赖
4.4 复制默认代码下来, 准备改造
4.5 集成步骤
4.6 配置文件修改:application.yml
4.7 配置类
4.8 配置OSS工具类
4.9 定义文件上传接口
4.10 使用示例
4.10.1 前端界面
4.10.2 选择图片并上传:
4.10.3 控制台打印日志, 可以看到上传到了aliyun对象存储bucket里面:
4.10.4 点开链接, 浏览器开启下载, 的确是自己上传的图片。
5. 致谢
0. OSS是什么
阿里云对象存储OSS (Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。
第三方服务的通用思路:
1. 使用对象存储服务的好处:
-
可扩展性
对象存储系统非常适合云环境,能够轻松地横向扩展以适应数据增长。由于数据是作为单独的对象进行管理,所以可以在不同的物理设备上无缝地分布这些对象,从而实现几乎无限的扩展。这使得对象存储非常适合存储大量非结构化数据,例如图片、视频和日志文件。
-
数据持久性和可靠性
对象存储系统通常将数据复制到多个服务器和地理位置,以确保数据的持久性和高可用性。这意味着即使发生硬件故障或其他类型的系统故障,数据仍然可以安全地恢复。此外,一些对象存储系统提供数据版本控制,这有助于防止数据丢失或覆盖。
-
成本效率
对象存储通常基于使用量付费的模型,使用户能够根据实际需求进行付费,而不用提前投资大量的存储设备。此外,由于其良好的可扩展性,用户可以根据需要逐渐增加存储容量,而无需过度投资。这样可以降低总体拥有成本(TCO)和运营成本。对象存储为云原生应用、数据湖、大数据分析、日志记录和机器学习等场景提供了一种低成本、高效益的方式来存储海量数据。
-
数据可访问性和共享
对象存储系统可以通过标准的HTTP/HTTPS协议访问,这意味着对象可以直接通过Web进行存储、检索和共享。这种方式简化了远程访问,使得数据共享和协作更加容易,尤其是对于分布在全球的团队和应用程序。
-
简化管理
由于对象存储系统通常使用扁平的命名空间而不是传统的文件系统层次结构,管理海量数据变得更加简单。无需处理复杂的文件系统限制,如文件夹大小或文件数目限制。用户可以通过简单的API调用来存储和检索数据,这使得集成和自动化更加容易。
2. 典型使用场景
-
图片/视频存储:用户头像、商品图片、短视频。
-
备份归档:数据库备份、日志文件长期存储。
-
静态网站托管:直接托管 HTML/CSS/JS 文件。
-
大数据分析:存储原始数据供后续处理(如日志分析)。
我们做简单项目, 用的最多的就是上传头像, 接下来的使用案例也是。
3. 接入服务全步骤_阿里云OSS
3.1 进入阿里云
3.2 登录
3.3 选择对象存储OSS
3.4 进入Bucket列表
3.5 创建Bucket, 输入名称并点击创建。
3.6 设置权限
3.6.1 关闭 阻止公共访问
3.6.2 设置读写权限为公有读
3.7 鼠标划到头像, 获取AccessKey
继续使用
需要验证手机号
3.7.1 保存id和密钥到桌面txt文件里面
4. 如何使用
4.1 点击SDK下载,并点击SDK示例, 文档中心打开, 查看文档
4.2 选择JAVA, 根据文档示例实操
4.3 导入pom依赖
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>
如果使用的是Java 9及以上的版本,则需要添加以下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>
4.4 复制默认代码下来, 准备改造
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.Bucket;import java.util.List;/*** OSS SDK 基础使用示例* 展示如何初始化 OSS 客户端并列出所有 Bucket*/public class Demo {public static void main(String[] args) throws Exception {// 创建 ClientBuilderConfiguration 实例,用于配置 OSS 客户端参数ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();// 设置签名算法版本为 V4clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);// 设置使用 HTTPS 协议访问 OSS,保证传输安全性clientBuilderConfiguration.setProtocol(Protocol.HTTPS);// 创建 OSS 客户端实例OSS ossClient = OSSClientBuilder.create()// 以华东1(杭州)地域的外网访问域名为例,Endpoint填写为oss-cn-hangzhou.aliyuncs.com.endpoint("oss-cn-hangzhou.aliyuncs.com")// 从环境变量中获取访问凭证(需提前配置 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET).credentialsProvider(CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider())// 设置客户端配置.clientConfiguration(clientBuilderConfiguration)// 以华东1(杭州)地域为例,Region填写为cn-hangzhou.region("cn-hangzhou").build();try {// 列出当前用户的所有 BucketList<Bucket> buckets = ossClient.listBuckets();// 遍历打印每个 Bucket 的名称for (Bucket bucket : buckets) {System.out.println(bucket.getName());}} finally {// 当OSSClient实例不再使用时,调用shutdown方法以释放资源ossClient.shutdown();}}
}
4.5 集成步骤
4.6 配置文件修改:application.yml
刚刚保存的key-id和密钥复制进来
rehse:alioss:endpoint: oss-cn-beijing.aliyuncs.comaccess-key-id: LTXXXXXXXXXXXXXXXXXXXXXXXXXXaccess-key-secret: S8xXXXXXXXXXXXXXXXXXXXXXbucket-name: bucket-rehse
endpoint就是你保存的区域节点,去复制下来即可:
4.7 配置类
对应于yml配置文件属性
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "rehse.alioss")
@Data
public class AliOssProperties {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;}
4.8 配置OSS工具类
import com.sky.properties.AliOssProperties;
import com.sky.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 配置类,用于创建AliOssUtil对象*/
@Configuration
@Slf4j
public class OssConfiguration {@Bean@ConditionalOnMissingBeanpublic AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());}
}
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;/*** 文件上传** @param bytes* @param objectName* @return*/public String upload(byte[] bytes, String objectName) {// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {// 创建PutObject请求。ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));} 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();}}//文件访问路径规则 https://BucketName.Endpoint/ObjectNameStringBuilder stringBuilder = new StringBuilder("https://");stringBuilder.append(bucketName).append(".").append(endpoint).append("/").append(objectName);log.info("文件上传到:{}", stringBuilder.toString());return stringBuilder.toString();}
}
4.9 定义文件上传接口
import com.sky.constant.MessageConstant;
import com.sky.result.Result;
import com.sky.utils.AliOssUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.UUID;/*** 通用接口*/
@RestController
@RequestMapping("/rehse")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {@Autowiredprivate AliOssUtil aliOssUtil;/*** 文件上传* @param file* @return*/@PostMapping("/upload")@ApiOperation("文件上传")public Result<String> upload(MultipartFile file){log.info("文件上传:{}",file);try {//原始文件名String originalFilename = file.getOriginalFilename();//截取原始文件名的后缀 dfdfdf.pngString extension = originalFilename.substring(originalFilename.lastIndexOf("."));//构造新文件名称String objectName = UUID.randomUUID().toString() + extension;//文件的请求路径String filePath = aliOssUtil.upload(file.getBytes(), objectName);return Result.success(filePath);} catch (IOException e) {log.error("文件上传失败:{}", e);}return Result.error(MessageConstant.UPLOAD_FAILED);}
}
4.10 使用示例
4.10.1 前端界面
4.10.2 选择图片并上传:
4.10.3 控制台打印日志, 可以看到上传到了aliyun对象存储bucket里面:
4.10.4 点开链接, 浏览器开启下载, 的确是自己上传的图片。
去阿里云OSS里面去看, 也保存一致, 上传成功:
5. 致谢
感谢宝宝们看完这篇博客, 感觉有帮助的话一键三连么么哒!
25届Java小登已入职, 入职后也要继续提升哇,猪咪将会不定期分享学习笔记!
重铸Java荣光, 我辈义不容辞!