Java封装阿里云对象存储OSS
阿里云对象存储OSS官网
本篇博客简单封装了阿里云的OSS存储中的建立连接;本地文件,输入流和URL三种方式上传文件,获取文件的输入流,删除文件,获取所有文件列表等功能。
OSS官方Api
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";@Testpublic void testUploadByNetworkStream(){//测试通过网络流上传文件try {URL url = new URL("https://www.aliyun.com/");OSSUtil.uploadByNetworkStream(ossClient, url, bucketName, "test/aliyun.html");} catch (MalformedURLException e) {e.printStackTrace();}}@Testpublic 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();}}@Testpublic void testUploadByFile(){//测试通过file上传文件 File file = new File("D:/applicationContext.xml");OSSUtil.uploadByFile(ossClient, file, bucketName, "test/applicationContext.xml");}@Testpublic void testDeleteFile(){//测试根据key删除oss服务器上的文件OSSUtil.deleteFile(ossClient, bucketName, "test/a.xml");}@Testpublic 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();}}@Testpublic void testQueryAllObject(){//测试查询某个bucket里面的所有文件List<String> results = OSSUtil.queryAllObject(OSSUtil.getOSSClient(), bucketName);System.out.println(results);}}
运行截图如下:
访问公共读权限的文件
附:OSSUtil项目源码
链接:https://pan.baidu.com/s/1ijcD7YXAMAI9lSrFhBwnqg 密码:fhxt















