原创

Java封装阿里云对象存储OSS

温馨提示:
本文最后更新于 2024年07月25日,已超过 267 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

阿里云对象存储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

oss01.png

oss02.png

注: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,如图:

oss03.png

从控制台上创建子用户和获取AccessKeyId和AccessKeySecret

oss04.png

oss05.png

oss06.png

oss07.png

oss08.png

oss09.png

如果已经有子用户的则在点击开始使用子用户,但是忘记了Accesskey的secret的时候,直接把弹出层关闭就可以了

oss10.png

oss11.png

oss12.png

下面开始正菜了!!!

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);
    }

}

运行截图如下:oss13.png

oss14.png

oss15.png

oss16.png

oss17.png

oss18.png

oss19.png

oss20.png

访问公共读权限的文件

oss21.png

oss22.png

附:OSSUtil项目源码

链接:https://pan.baidu.com/s/1ijcD7YXAMAI9lSrFhBwnqg 密码:fhxt

正文到此结束