一、添加依赖包,到https://mvnrepository.com/这个网站去查找所需的依赖包;
<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.4.0</version>
</dependency>
二、创建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
网友评论