阿里云对象存储

1.依赖jar

 <!-- 阿里云对象存储 -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.2</version>
        </dependency>

2.封装的工具类

package com.xiaolc.util;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.aliyun.oss.model.PutObjectResult;

/**
 * @author lc
 * @create 2019-03-28 14:12
 * @ClassName OSSUtil
 **/
public class OSSUtil {
    /**
     * @return OSSClient oss客户端
     * @throws
     * @Title: getOSSClient
     * @Description: 获取oss客户端
     */
    public static OSSClient getOSSClient() {
        //使用你的对应的endpoint地址
        String endpoint = "http://oss-cn-shanghai.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录https://ram.console.aliyun.com 创建RAM账号。
        String accessKeyId = "";
        String accessKeySecret = "";
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        return ossClient;
    }

    /**
     * @param ossClient  oss客户端
     * @param url        URL
     * @param bucketName bucket名称
     * @param objectName 上传文件目录和(包括文件名)例如“test/index.html”
     * @return void        返回类型
     * @throws
     * @Title: uploadByNetworkStream
     * @Description: 通过网络流上传文件
     */
    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();
            }
        }
    }

    /**
     * @param ossClient   oss客户端
     * @param inputStream 输入流
     * @param bucketName  bucket名称
     * @param objectName  上传文件目录和(包括文件名) 例如“test/a.jpg”
     * @return void        返回类型
     * @param catalog    文件上传目录
     * @throws
     * @Title: uploadByInputStream
     * @Description: 通过输入流上传文件
     */
    public static void uploadByInputStream(OSSClient ossClient, InputStream inputStream, String bucketName,
                                           String objectName, String catalog) {
        try {
            ossClient.putObject(bucketName, catalog + "/" + objectName, inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    /**
     * @param ossClient  oss客户端
     * @param file       上传的文件
     * @param bucketName bucket名称
     * @param objectName 文件名称 例如“a.jpg”
     * @param catalog    文件上传目录
     * @return void        返回类型
     * @throws
     * @Title: uploadByFile
     * @Description: 通过file上传文件
     */
    public static void uploadByFile(OSSClient ossClient, File file, String bucketName, String objectName, String catalog) {
        try {
            ossClient.putObject(bucketName, catalog + "/" + objectName, file);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }


    /**
     * @param ossClient  oss客户端
     * @param bucketName bucket名称
     * @param key        文件路径/名称,例如“test/a.txt”
     * @return void            返回类型
     * @throws
     * @Title: deleteFile
     * @Description: 根据key删除oss服务器上的文件
     */
    public static void deleteFile(OSSClient ossClient, String bucketName, String key) {
        ossClient.deleteObject(bucketName, key);
    }

    /**
     * @param ossClient  oss客户端
     * @param bucketName bucket名称
     * @param key        文件路径和名称
     * @return InputStream    文件输入流
     * @throws
     * @Title: getInputStreamByOSS
     * @Description:根据key获取服务器上的文件的输入流
     */
    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;
    }

    /**
     * @param ossClient  oss客户端
     * @param bucketName bucket名称
     * @return List<String>  文件路径和大小集合
     * @throws
     * @Title: queryAllObject
     * @Description: 查询某个bucket里面的所有文件
     */
    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;
    }

    public static String genImageName() {
        //取当前时间的长整形值包含毫秒
        long millis = System.currentTimeMillis();
        //long millis = System.nanoTime();
        //加上三位随机数
        Random random = new Random();
        int end3 = random.nextInt(999);
        //如果不足三位前面补0
        String str = millis + String.format("%03d", end3);
        return str;
    }

    /**
     * 获取上传地址
     *
     * @param bucketName
     * @param filename
     * @param catalog
     * @return
     */
    public static String url(String bucketName, String filename, String catalog) {
        Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
        //返回文件url地址
        String u = getOSSClient().generatePresignedUrl(bucketName, catalog + "/" + filename, expiration).toString();
        return u.substring(0, u.indexOf("?"));
    }

}

3.测试

package com.xiaolc;

import com.aliyun.oss.OSSClient;
import com.xiaolc.util.OSSUtil;
import org.junit.Test;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
import java.util.List;

/**
 * @author lc
 * @create 2019-03-28 14:16
 * @ClassName OSSUtilTest
 **/
public class OSSUtilTest {
    private OSSClient ossClient = OSSUtil.getOSSClient();
    private String bucketName = "xiaolc-2";

    @Test
    public void testUploadByNetworkStream() {
        //测试通过网络流上传文件
        try {
            URL url = new URL("https://www.aliyun.com/");
            OSSUtil.uploadByNetworkStream(ossClient, url, bucketName, "test/aliyun.html");
            Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
            String u = ossClient.generatePresignedUrl(bucketName, "test/aliyun.html", expiration).toString();
            System.out.println(u.substring(0, u.indexOf("?")));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testUploadByInputStream() {
        //文件存储目录不用加/
        String catalog = "test";
        //测试通过输入流上传文件
        File file = new File("D:/applicationContext.xml");
        try {
            InputStream inputStream = new FileInputStream(file);
            String filename = OSSUtil.genImageName()+file.getName();
            OSSUtil.uploadByInputStream(ossClient, inputStream, bucketName, filename,catalog);
            String url = OSSUtil.url(bucketName, filename, catalog);
            System.out.println(url);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testUploadByFile() {
        //文件存储目录不用加/
        String catalog = "test";
        //测试通过file上传文件
        File file = new File("D:/1.jpg");
        //文件名称
        String filename = OSSUtil.genImageName() + file.getName();
        //上传
        OSSUtil.uploadByFile(ossClient, file, bucketName, filename,catalog);
       //获取文件url
        String url = OSSUtil.url(bucketName, filename,catalog);
        System.out.println(url);
    }

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

}

4.源代码链接

https://github.com/qpdyg/aly.git

猜你喜欢

转载自blog.csdn.net/qq_41988504/article/details/88872765