• 文件上传很难搞?10分钟带你学会阿里云OSS对象存储


    . 前言

    最近有很多小伙伴问壹哥,如果我们要进行大规模的文件存储该怎么做?

    其实实现文件存储的技术有很多,如果我们在网上搜索一下,你会发现实现的技术简直是五花八门,比如有一种技术叫FastDFS就可以实现文件存储,但该方案需要自己搭建服务器,非常的麻烦。

    实际上现在很多公司都在使用腾讯云或者阿里云技术,比如阿里云就提供了OSS对象存储技术,该技术安全可靠且用起来简单的要死,只需10分钟就可以上手搞定存储。什么?你不信?!那就跟着壹哥一步步来,如果壹哥带你10分钟搞定文件存储,你就给我点个赞呗!

    . 浅析OSS对象存储作用

    在学习OSS具体实现之前,我们先来简单了解一下OSS是怎么个东东吧。

    阿里云对象存储OSS,简单地说就是我们花钱在阿里购买一块存储空间,然后我们就可以将图片、音频、视频等各种文件资源存储在对象存储OSS服务器上。接着对象存储OSS服务器就可以供有权限的人员上传、下载、删除这些文件。

    所以有了OSS,我们就省去了购买硬件存储服务器、搭建存储服务器、运营管理存储服务器等一系列的繁琐操作了。

    有了这些基本的了解之后,我们就可以开始使用OSS了。当然,首先我们得购买OSS服务!

    . 对象存储OSS注册和配置

    阿里云对象存储OSS官网地址 :

    对象存储OSS_云存储服务_企业数据管理_存储-阿里云

    3.1 注册和登录

    进入阿里云官网后,首先就是注册和登录,我们可以使用自己的支付宝账号登录,可以在阿里云手机客户端扫码登录,或者用账号密码登录,总之阿里云提供了多种登录形式。基本上阿里旗下的产品,用自己的支付宝账号都可以通用。

    3.2 开通对象存储OSS服务

    首先我们找到阿里云的对象存储OSS服务,点击进入。

    点击开通按钮,开通对象存储OSS服务。

    3.3. 管理控制台

    注册、登录、开通OSS服务后,点击管理控制台,进入控制台界面。

    接着进入到控制台界面。

    这里我们要先创建一个Bucket桶,点击Bucket列表菜单,点击创建Bucket按钮,然后按照下面的内容填写即可。大家要注意,Bucket桶的名称要唯一,不能重复。

     3.4 使用控制台上传图片

    创建完Bucket桶后,我们就可以使用控制台上传文件进行测试了,上传操作如下:

    成功上传一张图片的结果如下:

    . 代码实现

    当然,我们在开发的时候,肯定不会这样手动上传文件,主要是利用代码进行实现。

    4.1 搭建项目环境

    我们先创建一个项目,名称就叫做aliyunossDemo吧。这里我们当然是利用Maven创建项目,大家记得不要选择使用Maven自带的骨架哦。

    接下来在pom.xml中导入依赖包。

    1. <parent>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-parentartifactId>
    4. <version>2.1.5.RELEASEversion>
    5. parent>
    6. <properties>
    7. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    8. <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
    9. <maven.compiler.source>1.8maven.compiler.source>
    10. <maven.compiler.target>1.8maven.compiler.target>
    11. <spring.boot.version>2.1.5.RELEASEspring.boot.version>
    12. <aliyun-oss-version>3.10.2aliyun-oss-version>
    13. <httpcore-verison>4.4.3httpcore-verison>
    14. <httpclient-version>4.5.1httpclient-version>
    15. properties>
    16. <dependencies>
    17. <dependency>
    18. <groupId>org.springframework.bootgroupId>
    19. <artifactId>spring-boot-starter-webartifactId>
    20. <version>${spring.boot.version}version>
    21. dependency>
    22. <dependency>
    23. <groupId>com.aliyun.ossgroupId>
    24. <artifactId>aliyun-sdk-ossartifactId>
    25. <version>${aliyun-oss-version}version>
    26. dependency>
    27. <dependency>
    28. <groupId>org.apache.httpcomponentsgroupId>
    29. <artifactId>httpcoreartifactId>
    30. <version>${httpcore-verison}version>
    31. dependency>
    32. <dependency>
    33. <groupId>org.apache.httpcomponentsgroupId>
    34. <artifactId>httpclientartifactId>
    35. <version>${httpclient-version}version>
    36. dependency>
    37. dependencies>

    注意,如果你的JDK是1.9或者以上版本需要加入jaxb相关依赖其他JDK版本不需要

    1. <dependency>
    2. <groupId>javax.xml.bindgroupId>
    3. <artifactId>jaxb-apiartifactId>
    4. <version>2.3.1version>
    5. dependency>
    6. <dependency>
    7. <groupId>javax.activationgroupId>
    8. <artifactId>activationartifactId>
    9. <version>1.1.1version>
    10. dependency>
    11. <dependency>
    12. <groupId>org.glassfish.jaxbgroupId>
    13. <artifactId>jaxb-runtimeartifactId>
    14. <version>2.3.3version>
    15. dependency>

    然后我们在resources目录下创建一个application.yml配置文件。

    1. spring:
    2. servlet:
    3. multipart:
    4. max-file-size: 10MB
    5. max-request-size: 10MB
    6. application:
    7. name: aliyun-oss-demo
    8. server:
    9. port: 9001
    10. aliyun:
    11. oss:
    12. #服务器地址, 我选择的是华北2-北京地址如下
    13. endpoint: http://oss-cn-beijing.aliyuncs.com
    14. #子账户名称,在自己控制台账户的Access中查看
    15. accessKeyId: 填写自己的accessKey
    16. #子账户密码
    17. accessKeySecret: 填写自己的accessSecret
    18. #自己创建的桶的名字
    19. bucketName: qianfeng-file

    接着我们创建一个启动类AliyunOssApplication。

    1. package com.qianfeng;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. /**
    5. * 微服务启动类
    6. * @Author 壹哥
    7. */
    8. @SpringBootApplication
    9. public class AliyunOssApplication {
    10. public static void main(String[] args) {
    11. SpringApplication.run(AliyunOssApplication.class, args);
    12. }
    13. }

    4.2 封装工具类

    创建com.qianfeng.util包,放入文件操作工具类AliyunOSSUtil。

    1. package com.qianfeng.util;
    2. import com.aliyun.oss.OSS;
    3. import com.aliyun.oss.OSSClient;
    4. import com.aliyun.oss.OSSClientBuilder;
    5. import com.aliyun.oss.model.*;
    6. import java.io.ByteArrayInputStream;
    7. import java.io.File;
    8. import java.io.InputStream;
    9. import java.util.Date;
    10. /**
    11. * 阿里云OSS上传,下载, 删除文件工具类
    12. * @Author 壹哥
    13. */
    14. public class AliyunOSSUtil {
    15. /**
    16. * byte数组格式上传文件
    17. * @param endpoint OSS对外服务的访问域名
    18. * @param accessKeyId accessKey账号
    19. * @param accessKeySecret accessKey密码
    20. * @param bucketName 桶名字
    21. * @param objectName 完整文件名, 例如abc/efg/123.jpg
    22. * @param content 文件内容, byte数组格式
    23. * @Author 壹哥
    24. */
    25. public static void uploadByByteArrayFile(String endpoint,
    26. String accessKeyId,
    27. String accessKeySecret,
    28. String bucketName,
    29. String objectName,
    30. byte[] content) throws Exception {
    31. // 创建OSSClient实例。
    32. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    33. //创建上传请求对象
    34. PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new ByteArrayInputStream(content));
    35. // 上传
    36. PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
    37. // 关闭OSSClient。
    38. ossClient.shutdown();
    39. }
    40. /**
    41. * 输入流格式上传文件
    42. * @param endpoint OSS对外服务的访问域名
    43. * @param accessKeyId accessKey账号
    44. * @param accessKeySecret accessKey密码
    45. * @param bucketName 桶名字
    46. * @param objectName 完整文件名, 例如abc/efg/123.jpg
    47. * @param content 文件内容, 输入流格式
    48. * @Author 壹哥
    49. */
    50. public static void uploadByInputStreamFile(String endpoint,
    51. String accessKeyId,
    52. String accessKeySecret,
    53. String bucketName,
    54. String objectName,
    55. InputStream content) {
    56. // 创建OSSClient实例。
    57. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    58. // 上传
    59. ossClient.putObject(bucketName, objectName, content);
    60. // 关闭OSSClient
    61. ossClient.shutdown();
    62. }
    63. /**
    64. * byte数组格式上传文件并返回上传后的URL地址
    65. * @param endpoint OSS对外服务的访问域名
    66. * @param accessKeyId accessKey账号
    67. * @param accessKeySecret accessKey密码
    68. * @param bucketName 桶名字
    69. * @param objectName 完整文件名, 例如abc/efg/123.jpg
    70. * @param content 文件内容, byte数组格式
    71. * @Author 壹哥
    72. */
    73. public static String uploadImage(String endpoint,
    74. String accessKeyId,
    75. String accessKeySecret,
    76. String bucketName,
    77. String objectName,
    78. byte[] content) throws Exception {
    79. // 创建OSSClient实例。
    80. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    81. // 创建上传文件的元信息,可以通过文件元信息设置HTTP header(设置了才能通过返回的链接直接访问)。
    82. ObjectMetadata objectMetadata = new ObjectMetadata();
    83. objectMetadata.setContentType("image/jpg");
    84. // 文件上传
    85. ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content), objectMetadata);
    86. // 设置URL过期时间为1小时。
    87. Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
    88. //返回url地址
    89. String url = ossClient.generatePresignedUrl(bucketName, objectName, expiration).toString();
    90. //关闭OSSClient。
    91. ossClient.shutdown();
    92. return url;
    93. }
    94. /**
    95. * 下载文件到本地
    96. * @param endpoint OSS对外服务的访问域名
    97. * @param accessKeyId accessKey账号
    98. * @param accessKeySecret accessKey密码
    99. * @param bucketName 桶名字
    100. * @param objectName 完整文件名, 例如abc/efg/123.jpg
    101. * @param localFile 下载到本地文件目录
    102. * @Author 壹哥
    103. */
    104. public static void downFile(String endpoint,
    105. String accessKeyId,
    106. String accessKeySecret,
    107. String bucketName,
    108. String objectName,
    109. String localFile) throws Exception {
    110. // 创建OSSClient实例。
    111. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    112. // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
    113. ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFile));
    114. // 关闭OSSClient。
    115. ossClient.shutdown();
    116. }
    117. /**
    118. * 删除文件
    119. * @param endpoint OSS对外服务的访问域名
    120. * @param accessKeyId accessKey账号
    121. * @param accessKeySecret accessKey密码
    122. * @param bucketName 桶名字
    123. * @param objectName 完整文件名, 例如abc/efg/123.jpg
    124. * @Author 壹哥
    125. */
    126. public static void deleteFile(String endpoint,
    127. String accessKeyId,
    128. String accessKeySecret,
    129. String bucketName,
    130. String objectName) {
    131. // 创建OSSClient实例。
    132. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    133. // 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
    134. ossClient.deleteObject(bucketName, objectName);
    135. // 关闭OSSClient。
    136. ossClient.shutdown();
    137. }
    138. }

    4.3 上传文件案例

    我们在Controller中实现文件上传。

    1. package com.qianfeng.controller;
    2. import com.qianfeng.util.AliyunOSSUtil;
    3. import org.springframework.beans.factory.annotation.Value;
    4. import org.springframework.web.bind.annotation.*;
    5. import org.springframework.web.multipart.MultipartFile;
    6. /**
    7. * 文件管理接口
    8. * 提供文件各种形式上传, 下载, 删除等操作
    9. * @Author 壹哥
    10. */
    11. @RestController
    12. @RequestMapping("/file")
    13. public class FileManagerController {
    14. //OSS服务器访问域名
    15. @Value("${aliyun.oss.endpoint}")
    16. private String endpoint;
    17. //子账户名
    18. @Value("${aliyun.oss.accessKeyId}")
    19. private String accessKeyId;
    20. //子账户密码
    21. @Value("${aliyun.oss.accessKeySecret}")
    22. private String accessKeySecret;
    23. //桶名字
    24. @Value("${aliyun.oss.bucketName}")
    25. private String bucketName;
    26. /**
    27. * byte数组形式上传
    28. * @param file
    29. * @Author 壹哥
    30. */
    31. @PostMapping("/upload1")
    32. public void upload(@RequestParam("file") MultipartFile file) throws Exception {
    33. AliyunOSSUtil.uploadByByteArrayFile(endpoint, accessKeyId, accessKeySecret, bucketName, file.getOriginalFilename(), file.getBytes());
    34. }
    35. /**
    36. * 输入流形式上传
    37. * @param file
    38. * @Author 壹哥
    39. */
    40. @PostMapping("/upload2")
    41. public void upload2(@RequestParam("file") MultipartFile file) throws Exception {
    42. AliyunOSSUtil.uploadByInputStreamFile(endpoint, accessKeyId, accessKeySecret, bucketName, file.getOriginalFilename(), file.getInputStream());
    43. }
    44. }

    4.4 上传图片并返回访问路径案例

    在这个案例中壹哥给大家展示了如何获取返回的访问路径。

    1. /**
    2. * 上传图片并返回上传后的URL地址
    3. * @param file
    4. * @Author 壹哥
    5. */
    6. @PostMapping("/upload3")
    7. public String upload3(@RequestParam("file") MultipartFile file) throws Exception {
    8. String url = AliyunOSSUtil.uploadImage(endpoint, accessKeyId, accessKeySecret, bucketName, file.getOriginalFilename(), file.getBytes());
    9. System.out.println("===壹哥===" + url);
    10. return url;
    11. }

    4.5 删除文件案例

    这是删除上传后的文件案例。

    1. /**
    2. * 删除文件
    3. * @param objName 需要删除的对象名称
    4. * @Author 壹哥
    5. */
    6. @DeleteMapping("/delete")
    7. public void deleteFile(String objName) {
    8. AliyunOSSUtil.deleteFile(endpoint, accessKeyId, accessKeySecret, bucketName, objName);
    9. }

    .

    至此,我们的阿里云OSS案例就讲完了,各位小伙伴是否跟壹哥学会了呢? 如果你还没学会,请关注Java架构栈,在评论区给我们留言或私信,把你的疑问告诉我们。当然也可以加入我们的学习群,免费获取更多学习资料和技术支持哦。

  • 相关阅读:
    【PHPCUSTOM】打包PHP程序为EXE
    应用软件漏洞排名
    san.js源码解读之工具(util)篇——extend函数
    html中image 区域点击的优点
    Grpc快速实践
    python面试题——版本管理工具GIT(二)
    SpringBoot 中整合JMS
    javaee之Elasticsearch相关知识
    FFplay文档解读-38-视频过滤器十三
    HTML5简明教程系列之HTML5 表格与表单(二)
  • 原文地址:https://blog.csdn.net/syc000666/article/details/126116359