阿里云java sdk官方教程文档地址:SDK示例-java
准备工作
找到自己Bucket的Endpoint地域节点信息
阿里云OSS对象存储服务开通之后,在阿里云运维界面上可以手动建一个bucket,假设现在已经有了一个bucket,在对象存储/Bucket列表/xxx-bucket(自己新建的bucket名称)/概览
网页目录下可以看到Endpoint(地域节点信息)
创建AccessKey信息
鼠标移到账户头像进入AccessKey管理页面
使用子用户AccessKey,如果没有子用户则创建一个,可以单独给子用户设置有限权限,切忌不要直接用主账户的AccessKey,风险很大,就相当于一个root用户啥权限都有,一旦泄露就玩完,子用户的AccessKey是可以创建和删除的,而且可以单独授权,这里给创建的子用户单独授权AliyunOSSFullAccess(管理对象存储服务OSS权限)
就可以了。
点击这个新建的子用户,可以创建AccessKey,点击创建AccessKey,下载AccessKey的csv文件保存,这个AccessKey每次创建只会出现一次,一旦关闭就再也看不到了,所以记得及时保存,当然要是忘了可以创建新的,把旧的在界面上删掉就可以。
编写封装代码
有了上面的EndPoint和AccessKey信息,就可以编写封装代码了。
maven引入aliyun-sdk-oss,截止发文,最新版是3.14.0:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.14.0</version>
</dependency>
创建OSSCloudConfig配置类
package com.zhaohy.app.client;
public class OSSCloudConfig {
static final String ENDPOINT_INTER = "oss-cn-guangzhou-internal.aliyuncs.com"; //ECS 的经典网络访问(内网)
static final String ENDPOINT = "oss-cn-guangzhou.aliyuncs.com"; //外网访问
static final String ACCESSKEYID = "your accesskeyId";
static final String ACCESSKEYSECRET = "your accesskeysecret";
static final String BUCKETNAME = "your bucket name";
public String objectPrefixName = "static/images/"; //基础文件夹
public String filePathPrefix = "https://" + BUCKETNAME + "." + ENDPOINT + "/" + objectPrefixName; //带https的完整访问前缀
public String getObjectPrefixName() {
return objectPrefixName;
}
public void setObjectPrefixName(String objectPrefixName) {
this.objectPrefixName = objectPrefixName;
}
public String getFilePathPrefix() {
return filePathPrefix;
}
public void setFilePathPrefix(String filePathPrefix) {
this.filePathPrefix = filePathPrefix;
}
}
其中objectPrefixName 和filePathPrefix 可以在代码中根据实际业务场景动态set
创建OSSCloudClient调用类
package com.zhaohy.app.client;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.comm.Protocol;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.zhaohy.app.utils.DateUtil;
import com.zhaohy.app.utils.PropertiesUtils;
public class OSSCloudClient {
private OSSCloudClient() {
super();
}
private static class SingletonContainer{
private static OSSCloudClient instance = new OSSCloudClient();
}
public static OSSCloudClient getInstance() {
return SingletonContainer.instance;
}
private OSS createOSS() {
ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
// 设置连接OSS所使用的协议(HTTP或HTTPS),默认为HTTP。
conf.setProtocol(Protocol.HTTPS);
// 创建OSSClient实例。
return new OSSClientBuilder().build(OSSCloudConfig.ENDPOINT, OSSCloudConfig.ACCESSKEYID, OSSCloudConfig.ACCESSKEYSECRET);
}
private Map<String, String> getObjectName(String fileName, String userId) {
Map<String, String> nameMap = new HashMap<>();
OSSCloudConfig config = new OSSCloudConfig();
String name = userId + "/" + DateUtil.getSystemDay() + "/" + UUID.randomUUID().toString().replace("-", "") + "_" + fileName;
nameMap.put("objectName", config.getObjectPrefixName() + name);
nameMap.put("filePath", config.getFilePathPrefix() + name);
return nameMap;
}
private String getObjectName(String filePath) {
OSSCloudConfig config = new OSSCloudConfig();
return config.getObjectPrefixName() + filePath.replace(config.getFilePathPrefix(), "");
}
/**
* 上传文件
* @param fileName 文件名称
* @param userId 用户id
* @param bytes byte数组
* @throws Exception
*/
public String uploadFile(String fileName, String userId, byte[] bytes) throws Exception {
Map<String, String> nameMap = this.getObjectName(fileName, userId);
String objectName = nameMap.get("objectName");
OSS ossClient = createOSS();
try {
ossClient.putObject(OSSCloudConfig.BUCKETNAME, objectName, new ByteArrayInputStream(bytes));
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return nameMap.get("filePath");
}
/**
* 上传文件
* @param fileName 文件名称
* @param userId 用户id
* @param localPath 本地文件路径
* @throws Exception
*/
public String uploadFile(String fileName, String userId, String localPath) throws Exception {
Map<String, String> nameMap = this.getObjectName(fileName, userId);
String objectName = nameMap.get("objectName");
OSS ossClient = createOSS();
try {
ossClient.putObject(OSSCloudConfig.BUCKETNAME, objectName, new FileInputStream(new File(localPath)));
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return nameMap.get("filePath");
}
/**
* 上传文件
* @param fileName 文件名称
* @param userId 用户id
* @param InputStream 文件输入流(fileInputStream或InputStream)
* @throws Exception
*/
public String uploadFile(String fileName, String userId, InputStream is) throws Exception {
Map<String, String> nameMap = this.getObjectName(fileName, userId);
String objectName = nameMap.get("objectName");
OSS ossClient = createOSS();
try {
ossClient.putObject(OSSCloudConfig.BUCKETNAME, objectName, is);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return nameMap.get("filePath");
}
/**
* 文件是否存在
* @param filePath 文件完整访问路径(带https)
* @return
*/
public Boolean fileExist(String filePath) {
String objectName = this.getObjectName(filePath);
OSS ossClient = createOSS();
try {
return ossClient.doesObjectExist(OSSCloudConfig.BUCKETNAME, objectName);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
* 列举文件
* @param dirPath 想要列举的文件夹 比如1/20220415
* @return
*/
public List<String> listFiles(String dirPath) {
OSSCloudConfig config = new OSSCloudConfig();
String objectDir = config.getObjectPrefixName() + dirPath;
// String objectName = this.getObjectName(filePath);
OSS ossClient = createOSS();
try {
ObjectListing objectListing = ossClient.listObjects(OSSCloudConfig.BUCKETNAME, objectDir);
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
List<String> list = new ArrayList<>();
for (OSSObjectSummary s : sums) {
list.add(config.getFilePathPrefix() + (s.getKey().replace(config.getObjectPrefixName(), "")));
}
return list;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
*
* @param filePath 删除文件或目录。如果要删除目录,目录必须为空。 (带域名访问路径的)
* @throws Exception
*/
public void deleteFile(String filePath) throws Exception {
String objectName = this.getObjectName(filePath);
OSS ossClient = createOSS();
try {
ossClient.deleteObject(OSSCloudConfig.BUCKETNAME, objectName);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
public static void main(String[] args) throws Exception {
OSSCloudClient client = OSSCloudClient.getInstance();
String filePath = client.uploadFile("读书记录封面.png", "1", "D:\\Pictures\\bookrecording\\读书记录封面.png");
System.out.println(filePath);
System.out.println(client.fileExist(filePath));
List<String> list = client.listFiles("1/20220416/");
for(String s : list) {
System.out.println(s);
client.deleteFile(s);
}
client.deleteFile("https://zhaohy-bucket.oss-cn-guangzhou.aliyuncs.com/static/images/1/20220415");
}
}
上面代码中利用阿里云官网教程上的简单上传文件用单例封装了上传文件
、文件是否存在
、列举文件
、删除文件或目录
等方法,可以OSSCloudClient client = OSSCloudClient.getInstance();
来实例化一个OSSCloudClient对象然后直接简单调用即可,需要其他功能的可以根据实际业务场景可以自己加。如果只是为了做图床用的话,这些方法已经够用了,main方法里写了调用例子。
如果是上传大文件,阿里云官方教程上还提供了追加文件
的api接口,有需要的可以自行看官网教程了解,调用都比较简单。