Spring Boot项目中文件上传(OSS对象存储的用法)

一、添加依赖包,到https://mvnrepository.com/这个网站去查找所需的依赖包;



    com.aliyun.oss
    aliyun-sdk-oss
    3.4.0

二、创建AccessKey

访问密钥AccessKey(AK)相当于登录密码,只是使用场景不同。AccessKey用于程序方式调用云服务API,而登录密码用于登录控制台。如果您不需要调用API,那么就不需要创建AccessKey。
可以使用AccessKey构造一个API请求(或者使用云服务SDK)来操作资源。AccessKey包括AccessKeyId和AccessKeySecret。

AccessKeyId用于标识用户。
AccessKeySecret是用来验证用户的密钥。AccessKeySecret必须保密。

三、创建配置文件application.properties,配置所需要的oss参数,

aliyun-oss.endpoint=https://oss-cn-hangzhou.aliyuncs.com
aliyun-oss.access-key-id=*********       //oss对应的id与secret
aliyun-oss.access-key-secret=**********
aliyun-oss.bucket-name=hpu-admin      //已经在控制台创建的bucket
aliyun-oss.path=ios   //上传文件的路径,如果bucket中不存在该路径,就创建
aliyun-oss.server-url=https://tp-app.oss-cn-hangzhou.aliyuncs.com
需要普及一下,我们保存在oss中的文件的外部访问链接的组成,参考https://mvp.aliyun.com/zhidao/2061:
https://bucket.endpoint/文件保存的bucket下面的路径

所以上面的aliyun-oss.server-url是为了代码中生成保存文件的链接使用的。

四、需要将配置中的信息进行bean的绑定

这里我们使用注解的方式将配置信息与bean对象的属性进行绑定

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = AliyunOssProperties.PREFIX)
@Data
public class AliyunOssProperties {
    public static final String PREFIX = "aliyun-oss";

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
    private String path;
    private String serverUrl;

}

五、上传文件(这里以文件流的形式上传),这里写一个工具类

//这里的basePath可以通过配置文件进行配置,也可以通过自己手动书写,指的是文件bucket下面的存储路径
public UploadFileDTO uploadFileToAliyunOss(MultipartFile picture , String basePath) {
//以时间戳对文件进行重命名,以免文件冲突
        String fileName = System.currentTimeMillis() + "_" + picture.getOriginalFilename() ;
        String uploadPath =  basePath + "/" + fileName;
        String key = "/" + basePath + "/" + fileName;
        OSSClient ossClient = new OSSClient(this.aliyunOssProperties.getEndpoint(), this.aliyunOssProperties
                .getAccessKeyId(), this.aliyunOssProperties.getAccessKeySecret());
        InputStream inputStream = null;
        UploadFileDTO dto = new UploadFileDTO();
        try {
            ObjectMetadata meta = new ObjectMetadata();
//获取图片的输入流
            inputStream = picture.getInputStream();
            meta.setContentType("text/plain");
            ossClient.putObject(this.aliyunOssProperties.getBucketName(), uploadPath, inputStream);
        } catch (OSSException oe) {
            throw new BaseException(ExceptionCode.ALI_OSS_OPEN_STORAGE_SERVICE_ERROR);
        } catch (ClientException ce) {
            throw new BaseException(ExceptionCode.ALI_OSS_REMOTE_ERROR);
        } catch (IOException e) {
            throw new BaseException(ExceptionCode.ALI_OSS_UPDATE_ERROR);
        } finally {
//关闭ossClient
            ossClient.shutdown();
        }
        dto.setName(fileName);
        dto.setKey(key);
        dto.setUrl(this.aliyunOssProperties.getServerUrl()+key);
        return dto;
    }

其中UploadFileDTO类为自己封装的一个类

import lombok.Data;

@Data
public class UploadFileDTO {

    String name;

    String key;

    String url;

    /**
     * 是否上传成功
     */
    boolean success = true;

    /**
     * 错误消息
     */
    String errorMsg;

    public UploadFileDTO() {
    }

    public UploadFileDTO(boolean success, String errorMsg) {
        this.success = success;
        this.errorMsg = errorMsg;
    }

ExceptionCode为自己封装的枚举异常类,里面是出现异常的情况下的编号与详解,下面我列出来这篇中用到的:

package com.tp.exception;

public enum ExceptionCode {
    
    SUCCESS("200","执行成功"),
    UNKNOWN_EXCEPTION("0","未知错误"),
    NOT_PERMISSION_ERROR("1","API暂不开放"),
    DB_ERR_EXCEPTION("1000","数据库操作失败"),
    DB_BUSY_EXCEPTION("1001","数据库繁忙"),
    PARAMETER_WRONG("1010","参数错误"),
    PARAMETER_MISSING("1011","缺少参数"),
    SIGN_FAILURE("1020","签名失败"),
    SIGN_ERROR("1021","签名错误"),
    REPEAT_OPERATION("1030", "重复操作"),
    
    INVALID_ACCESS_EXCEPTION("2000","用户名或者密码错误"),
    NO_THIS_USER("2001","查无此用户"),
    NO_PERMIT("2002", "未登陆"),
    LOGIN_TIMEOUT("2003", "登录超时"),
    USER_NOT_PERMISSION("2004", "账号已经申请注册,暂未通过审核"),
    USER_PHONE_HAS_REGISTERED("2005", "该手机号已经申请注册"),
    USER_DELETE_REGISTERED("2006", "该账号权限已经被禁止使用"),

    ALI_OSS_OPEN_STORAGE_SERVICE_ERROR("9000","当访问对象存储服务 Open Storage Service 失败时抛出该异常类实例,请重新尝试"),
    ALI_OSS_REMOTE_ERROR("9001","尝试访问阿里云服务时的异常,请重新尝试"),
    ALI_OSS_UPDATE_ERROR("9002","上传文件失败,请重新尝试"),
    ALI_OSS_FILE_SAVE_ERROR("9003","上传文件保存失败,请重新尝试"),

    API_NOT_PERMISSION_ERROR("10000","数据未授权。"),
    PAGES_NOT_PERMISSION_ERROR("10001","页面未授权。"),

    private String code;
    private String msg;

    ExceptionCode(String code, String msg){
        this.code = code;
        this.msg = msg;
    }

    public String getCode(){
        return code;
    }
    public String getMsg(){
        return msg;
    }

    public static ExceptionCode getByCode(String code){
        for(ExceptionCode ec : ExceptionCode.values()){
            if(ec.getCode().equals(code)){
                return ec;
            }
        }
        return null;
    }
}

主要参考阿里云的SDK文档:
https://help.aliyun.com/product/31815.html?spm=a2c4g.750001.list.19.32cb7b13LsEI5B

你可能感兴趣的:(Spring Boot项目中文件上传(OSS对象存储的用法))