欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springboot整合阿里云OSS实现文件上传

程序员文章站 2022-04-12 22:44:58
springboot整合阿里云OSS实现文件上传!共享测试源码~...

平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~

 

springboot整合阿里云OSS实现文件上传

      在电商项目中,PLP、PDP、活动页、商品推荐和订单详情等几乎所有页面都会有访问图片资源的情况。而且PLP和PDP页面访问图片资源的频次更高!将图片保存到本地是一个极其不明智的选择,因为用户访问图片资源会占用大量的流量带宽。通常正确的做法是:将图片资源储存到阿里云oss等类似的云对象存储服务器上。

      本文主要讲解springboot项目整合阿里OSS实现图片文件上传的过程。

 

1 OSS对象存储

      阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。

 

2 OSS相关概念

(1)Endpoint:外网访问oss服务器的域名,通过该域名可以访问OSS服务的API,进行文件上传、下载等操作。

(2)Bucket:存储空间,是存储对象的容器,所有存储对象都必须隶属于某个存储空间。

(3)Object:对象,对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件(可以是.png,.txt等任意文件)。

(4)AccessKey:访问密钥,指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。

 

3 开通并设置阿里OSS

3.1 开通OSS服务

      步骤1:登录到阿里云官网;

      步骤2:点击下图所示"对象存储OSS"菜单。

springboot整合阿里云OSS实现文件上传

 

3.2 创建存储空间Bucket

      点击“创建Bucket”按钮。

springboot整合阿里云OSS实现文件上传

      按照下图填写bucket名称和相关配置后,点击“确认”保存即可!注意:读写权限应当选择“公共读”,否则上传的文件无法访问!

springboot整合阿里云OSS实现文件上传

      这样,我们的文件存储空间bucket就创建好了。

springboot整合阿里云OSS实现文件上传

 

3.3 跨域(cros)设置

      由于浏览器安全策略,不允许跨域资源访问,所以我们要设置OSS的跨域资源共享。

      步骤1:打开上面创建的存储空间nicle-oss-bucket

springboot整合阿里云OSS实现文件上传

      步骤2:打开权限管理页面,并点击跨域设置的“设置”按钮

      打开权限管理页面,并点击跨域设置的“设置”按钮,即可进入跨域规则设置页面!

springboot整合阿里云OSS实现文件上传

      跨域规则设置页面:

springboot整合阿里云OSS实现文件上传

      点击“创建规则”按钮,填写跨域配置允许所有域请求(*)!当然这里可以指定域进行访问。

springboot整合阿里云OSS实现文件上传

springboot整合阿里云OSS实现文件上传

 

4 创建accessKeyId和accessKeySecret

springboot整合阿里云OSS实现文件上传

springboot整合阿里云OSS实现文件上传

springboot整合阿里云OSS实现文件上传

      短信验证后就可以获取到了accessKeyId和accessKeySecret了。

springboot整合阿里云OSS实现文件上传

 

5 代码实现:基于springboot服务端项目调用oss API实现文件上传到oss服务器

      项目目录结构如下:

springboot整合阿里云OSS实现文件上传

5.1 引进入oss依赖包

  <properties>
    <aliyun-oss.version>2.5.0</aliyun-oss.version>
  </properties>

  <!--阿里云oss文件存储服务器依赖包-->
  <dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>${aliyun-oss.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.1.7.RELEASE</version>
    <scope>compile</scope>
  </dependency>

 

5.2 常量接口类

      创建常量接口类:OssConstant.java

/**
 * 配置常量
 */
public interface OssConstant {

  //外网访问oss服务器的域名
  public static final String END_POINT = "oss-cn-beijing.aliyuncs.com";

  //访问KEY_ID
  public static final String ACCESS_KEY_ID = "LTAIFrerFxxxxxxEwJfNSPoL";

  //访问密钥
  public static final String ACCESS_KEY_SECRET = "jG46wbefAxxxxxx1OQuyl8MLcuGoO5";

  //文件存储空间
  public static final String BUCKET = "nicle-oss-bucket";
}

 

5.3 定义接口返回对象

      定义接口返回对象:Result.java

import lombok.Data;

/**
 * 接口返回对象
 */
@Data
public class Result<T> {

  public static final String DEFAULT_FAILED_CODE = "9998";
  public static final String DEFAULT_FAULT_CODE = "9999";
  public static final String DEFAULT_SUCCESS_CODE = "0";

  /**
   * 错误返回时的错误码
   */
  private String code;

  /**
   * 错误返回时的错误信息
   */
  private String message;

  /**
   * status为SC_OK时的JSON字符串
   */
  private T data;

  /**
   * 构造函数(成功返回时使用)
   *
   * @param object 支持转换JSON格式的Java对象
   */
  public Result(T object) {

    this.code = DEFAULT_SUCCESS_CODE;
    this.message = "";
    this.data = object;
  }

  /**
   * 构造函数(失败返回时使用)
   */
  public Result(String code, String message) {

    this.code = code;
    this.message = message;
    this.data = null;
  }

  public static <T> Result<T> ok() {
    return new Result<>(null);
  }

  public static <T> Result<T> ok(T data) {
    return new Result<>(data);
  }

  public static <T> Result<T> failed(String message) {

    return new Result<>(DEFAULT_FAILED_CODE, message);
  }

  public static <T> Result<T> failed(String code, String message) {

    return new Result<>(code, message);
  }

  public static <T> Result<T> fault(String message) {

    return new Result<>(DEFAULT_FAULT_CODE, message);
  }

  public static <T> Result<T> fault(String code, String message) {

    return new Result<>(code, message);
  }
}

 

5.4 创建OSS客户端配置类

      OSS客户端配置类:OssConfig.java

/**
 * OSS客户端配置类
 */
@Configuration
public class OssConfig {

  /**
   * 定义ossClient bean对象
   */
  @Bean
  public OSSClient ossClient() {
    return new OSSClient(OssConstant.END_POINT, OssConstant.ACCESS_KEY_ID, OssConstant.ACCESS_KEY_SECRET);
  }
}

 

5.5 创建Oss服务接口类

      Oss服务接口类:IOssService.java

public interface IOssService {

  /**
   * 上传图片到OSS服务器
   * @return oss服务器图片访问url
   */
  String uploadPic();
}

 

5.6 创建Oss服务接口实现类

      Oss服务接口实现类:OssServiceImpl.java

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.entity.ContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

@Slf4j
@Service
public class OssServiceImpl implements IOssService {

  @Autowired
  private OSSClient ossClient;

  /**
   * 上传图片到OSS服务器
   *
   * @return oss服务器图片访问url
   */
  @Override
  public String uploadPic() {
    String picUrl = "";
    try {
      //1.从本地读取图片文件
      File file = new File("C:\\Users\\jm010426\\Desktop\\1.png");
      MultipartFile multipartFile = new MockMultipartFile(file.getName(),
          file.getName(),
          ContentType.APPLICATION_OCTET_STREAM.toString(),
          new FileInputStream(file));
      //2.生成oss服务器图片名称(这里用uuid拼接一个name,防止上传图片与其他图片重名而覆盖同名oss文件)
      String fileName = UUID.randomUUID().toString().replace("-", "") + "_" + multipartFile.getOriginalFilename();
      //3.上传到oss服务器
      picUrl = uploadToOss(fileName, new ByteArrayInputStream(multipartFile.getBytes()));
    } catch (Exception e) {
      log.error("picture upload failed. error:", e);
    }
    return picUrl;
  }

  /**
   * 上传图片
   *
   * @param fileName 图片名称,图片名称包括文件夹名称和“/”
   * @param in 图片输入流
   */
  private String uploadToOss(String fileName, InputStream in) {
    // 上传Object.
    ossClient.putObject(OssConstant.BUCKET, fileName, in);
    //返回oss服务器访问上传图片的url
    return "https://" + OssConstant.BUCKET + "." + OssConstant.END_POINT + "/" + fileName;
  }
}

 

5.7 Oss控制器类

      Oss控制器类:OssController.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Oss控制器
 */
@RestController
@RequestMapping(value = "/oss")
public class OssController {

  @Autowired
  private IOssService ossService;

  /**
   * 文件上传到阿里oss服务器
   */
  @GetMapping("upload")
  public Result<String> upload() {
    String picUrl = ossService.uploadPic();
    if (StringUtils.isEmpty(picUrl)) {
      return Result.failed("上传失败");
    }
    return Result.ok(picUrl);
  }
}

 

6 测试图片上传

6.1 启动项目

springboot整合阿里云OSS实现文件上传

 

6.2 访问接口上传图片

      访问接口:http://localhost:8080/oss/upload

      请求方式:get

springboot整合阿里云OSS实现文件上传

       响应结果:

springboot整合阿里云OSS实现文件上传

 

6.3 访问oss图片链接

springboot整合阿里云OSS实现文件上传

 

6.4 阿里云平台查看oss服务器上的图片文件

springboot整合阿里云OSS实现文件上传

      如果对你需要帮助或本测试案例源码,关注微信公众号【IT特靠谱】,回复"我要oss项目源码"免费领取吧~

 

springboot整合阿里云OSS实现文件上传

 

本文地址:https://blog.csdn.net/IT_Most/article/details/109628047