Java封装阿里云对象存储OSS
温馨提示:
本文最后更新于 2024年07月25日,已超过 267 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
本篇博客简单封装了阿里云的OSS存储中的建立连接;本地文件,输入流和URL三种方式上传文件,获取文件的输入流,删除文件,获取所有文件列表等功能。
OSSpom:
<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.2</version>
</dependency>
SDK下载地址:Aliyun OSS SDK For Java
注:Endpoint是指你的oss是那个地域的,每个地域的OSS对应不同的网址。下面是OSS开通Region和Endpoint对照表
Region中文名称 | Region英文表示 | 外网Endpoint |
---|---|---|
华东 1 | oss-cn-hangzhou | oss-cn-hangzhou.aliyuncs.com |
华东 2 | oss-cn-shanghai | oss-cn-shanghai.aliyuncs.com |
华北 1 | oss-cn-qingdao | oss-cn-qingdao.aliyuncs.com |
华北 2 | oss-cn-beijing | oss-cn-beijing.aliyuncs.com |
华北 3 | oss-cn-zhangjiakou | oss-cn-zhangjiakou.aliyuncs.com |
华北 5 | oss-cn-huhehaote | oss-cn-huhehaote.aliyuncs.com |
华南 1 | oss-cn-shenzhen | oss-cn-shenzhen.aliyuncs.com |
香港 | oss-cn-hongkong | oss-cn-hongkong.aliyuncs.com |
美国西部 1 (硅谷) | oss-us-west-1 | oss-us-west-1.aliyuncs.com |
美国东部 1 (弗吉尼亚) | oss-us-east-1 | oss-us-east-1.aliyuncs.com |
亚太东南 1 (新加坡) | oss-ap-southeast-1 | oss-ap-southeast-1.aliyuncs.com |
亚太东南 2 (悉尼) | oss-ap-southeast-2 | oss-ap-southeast-2.aliyuncs.com |
亚太东南 3 (吉隆坡) | oss-ap-southeast-3 | oss-ap-southeast-3.aliyuncs.com |
亚太东南 5 (雅加达) | oss-ap-southeast-5 | oss-ap-southeast-5.aliyuncs.com |
亚太东北 1 (日本) | oss-ap-northeast-1 | oss-ap-northeast-1.aliyuncs.com |
亚太南部 1 (孟买) | oss-ap-south-1 | oss-ap-south-1.aliyuncs.com |
欧洲中部 1 (法兰克福) | oss-eu-central-1 | oss-eu-central-1.aliyuncs.com |
中东东部 1 (迪拜) | oss-me-east-1 | oss-me-east-1.aliyuncs.com |
另外一种获取方法,在你的控制台的对象存储里面选择你的bucket,概览里面有访问域名也就是Endpoint,如图:
从控制台上创建子用户和获取AccessKeyId和AccessKeySecret
如果已经有子用户的则在点击开始使用子用户,但是忘记了Accesskey的secret的时候,直接把弹出层关闭就可以了
下面开始正菜了!!!
OSSUtil代码
package com.fxyh.util;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
public class OSSUtil {
/**
*
* @Title: getOSSClient
* @Description: 获取oss客户端
* @return OSSClient oss客户端
* @throws
*/
public static OSSClient getOSSClient() {
//使用你的对应的endpoint地址
String endpoint = "http://oss-cn-shenzhen.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "你的accessKeyId";
String accessKeySecret = "你的accessKeySecret";
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
return ossClient;
}
/**
*
* @Title: uploadByNetworkStream
* @Description: 通过网络流上传文件
* @param ossClient oss客户端
* @param url URL
* @param bucketName bucket名称
* @param objectName 上传文件目录和(包括文件名)例如“test/index.html”
* @return void 返回类型
* @throws
*/
public static void uploadByNetworkStream(OSSClient ossClient, URL url, String bucketName, String objectName) {
try {
InputStream inputStream = url.openStream();
ossClient.putObject(bucketName, objectName, inputStream);
ossClient.shutdown();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
*
* @Title: uploadByInputStream
* @Description: 通过输入流上传文件
* @param ossClient oss客户端
* @param inputStream 输入流
* @param bucketName bucket名称
* @param objectName 上传文件目录和(包括文件名) 例如“test/a.jpg”
* @return void 返回类型
* @throws
*/
public static void uploadByInputStream(OSSClient ossClient, InputStream inputStream, String bucketName,
String objectName) {
try {
ossClient.putObject(bucketName, objectName, inputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
*
* @Title: uploadByFile
* @Description: 通过file上传文件
* @param ossClient oss客户端
* @param file 上传的文件
* @param bucketName bucket名称
* @param objectName 上传文件目录和(包括文件名) 例如“test/a.jpg”
* @return void 返回类型
* @throws
*/
public static void uploadByFile(OSSClient ossClient, File file, String bucketName, String objectName) {
try {
ossClient.putObject(bucketName, objectName, file);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
*
* @Title: deleteFile
* @Description: 根据key删除oss服务器上的文件
* @param ossClient oss客户端
* @param bucketName bucket名称
* @param key 文件路径/名称,例如“test/a.txt”
* @return void 返回类型
* @throws
*/
public static void deleteFile(OSSClient ossClient, String bucketName, String key) {
ossClient.deleteObject(bucketName, key);
}
/**
*
* @Title: getInputStreamByOSS
* @Description:根据key获取服务器上的文件的输入流
* @param ossClient oss客户端
* @param bucketName bucket名称
* @param key 文件路径和名称
* @return InputStream 文件输入流
* @throws
*/
public static InputStream getInputStreamByOSS(OSSClient ossClient, String bucketName, String key) {
InputStream content = null;
try {
OSSObject ossObj = ossClient.getObject(bucketName, key);
content = ossObj.getObjectContent();
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
/**
*
* @Title: queryAllObject
* @Description: 查询某个bucket里面的所有文件
* @param ossClient oss客户端
* @param bucketName bucket名称
* @return List<String> 文件路径和大小集合
* @throws
*/
public static List<String> queryAllObject(OSSClient ossClient, String bucketName) {
List<String> results = new ArrayList<String>();
try {
// ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。
ObjectListing objectListing = ossClient.listObjects(bucketName);
// objectListing.getObjectSummaries获取所有文件的描述信息。
for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
results.add(" - " + objectSummary.getKey() + " " + "(size = " + objectSummary.getSize() + ")");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return results;
}
}
测试代码
junit pom:
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
package com.fxyh.test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import org.junit.Test;
import com.aliyun.oss.OSSClient;
import com.fxyh.util.OSSUtil;
public class OSSUtilTest {
private OSSClient ossClient = OSSUtil.getOSSClient();
private String bucketName = "你的bucketName";
@Test
public void testUploadByNetworkStream(){
//测试通过网络流上传文件
try {
URL url = new URL("https://www.aliyun.com/");
OSSUtil.uploadByNetworkStream(ossClient, url, bucketName, "test/aliyun.html");
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
@Test
public void testUploadByInputStream(){
//测试通过输入流上传文件
try {
InputStream inputStream = new FileInputStream(new File("D:/applicationContext.xml"));
OSSUtil.uploadByInputStream(ossClient, inputStream, bucketName, "test/a.xml");
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testUploadByFile(){
//测试通过file上传文件
File file = new File("D:/applicationContext.xml");
OSSUtil.uploadByFile(ossClient, file, bucketName, "test/applicationContext.xml");
}
@Test
public void testDeleteFile(){
//测试根据key删除oss服务器上的文件
OSSUtil.deleteFile(ossClient, bucketName, "test/a.xml");
}
@Test
public void testGetInputStreamByOSS(){
//测试根据key获取服务器上的文件的输入流
try {
InputStream content = OSSUtil.getInputStreamByOSS(ossClient, bucketName, "test/applicationContext.xml");
if (content != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
while (true) {
String line = reader.readLine();
if (line == null) break;
System.out.println("\n" + line);
}
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
content.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testQueryAllObject(){
//测试查询某个bucket里面的所有文件
List<String> results = OSSUtil.queryAllObject(OSSUtil.getOSSClient(), bucketName);
System.out.println(results);
}
}
运行截图如下:
访问公共读权限的文件
附:OSSUtil项目源码
正文到此结束
- 本文标签: Java OSS
- 本文链接: https://fxyh.top/article/26
- 版权声明: 本文由fxyh原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权