阿里云oss对象服务器操作研究

给阿里云上传内容(图片、视频、word等等)。
首先需要引入阿里云提供的包,然后就可以使用阿里云oss提供的api进行操作。

      <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
       </dependency>

首先需要新建一个OSSClient控制端,客户端需要三个参数。

OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);

endpoint是在oss管理控制台新建Bucket时,选择的地区。
accessKeyId和accessKeySecret属于用户,在管理控制台可以看到accessKeyId。只有在用户第一次被创建的时候,才可以看到accessKeySecret。

oss的访问控制RAM有四个步骤:管理授权策略、创建群组并授权、创建用户并加入群组、完成授权。
例:我建了一个群组,并且创建了一个用户加入了群组,所以用户获得了群组的权限。
群组权限有:管理对象存储服务(OSS)权限、只读访问对象存储服务(OSS)的权限等等,很多。常用的是管理对象存储服务(OSS)权限。

ossClient.putObject(bucketName, fileKey, inputStream);
其中fileKey可以包含路径,比如:test/liuyifei.jpg

Bucket在创建时,有三种权限可供选择,私有、公共读、公共读写。公共读在访问的时候不需要签名,直接就能访问,比如:https://.oss-cn-hangzhou.aliyuncs.com/test/liuyifei.jpg

而私有的Bucket必须要对每个对象进行操作,然后生成访问链接。

URL url = ossClient.generatePresignedUrl(bucketName, fileKey, cal.getTime());

其中cal.getTime()是链接有效时间,在有效时间内,才能访问。
https://.oss-cn-beijing.aliyuncs.com/liuyifei.jpg?Expires=1533181470&OSSAccessKeyId=TMP.AQHlFjL73rTJ7p48ozPpDtL56I4Gijr3kIzLTtyNz9KLixH5rRvqoY6MgaHWAAAwLAIUGZBw077mmE1lkNIE7_SV5TynAKgCFHcqZZu463KN0XZVnd3KiEZ-AV1&Signature=jyexaAsqBs2RE%2FqfwrMwdVOTYE%3D
这种就是私有Bucket的api。

我写的方法,在上传图片时,顺带也就生成访问链接(默认给的有效时间为十年)。
上传图片和根据文件名生成访问链接,这两个操作不是耦合的。

压缩图片选用谷歌给的包,评论都说这个方法效率高。

  <dependency>
           <groupId>net.coobird</groupId>
             <artifactId>thumbnailator</artifactId>
        <version>0.4.8</version>
    </dependency>

操作api非常简单,根据路径压缩图片后,在新路径生成文件。
Thumbnails.of(originalStringPath).scale(1f).outputQuality(compressFloat).toFile(returnPath);

下面是我能用到的代码

package com.aliyun.oss.demo;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Base64;
import java.util.Calendar;
import java.util.Date;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.BucketInfo;

import net.coobird.thumbnailator.Thumbnails;

public class OSSServiceImpl {


    private static String endpoint = "http://oss-cn-beijing.aliyuncs.com";
    private static String accessKeyId = "";
    private static String accessKeySecret = "";

    private static String bucketName = "";



    /**
     * 获取bucket信息
     * @return BucketInfo
     */
    public BucketInfo getBucketInfo() {
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        BucketInfo info = null;
        try {
            if (ossClient.doesBucketExist(bucketName)) {
                System.out.println("您已经创建Bucket:" + bucketName + "。");
            } else {
                System.out.println("您的Bucket不存在,创建Bucket:" + bucketName + "。");
                ossClient.createBucket(bucketName);
            }
            info = ossClient.getBucketInfo(bucketName);
            System.out.println("Bucket " + bucketName + "的信息如下:");
            System.out.println("\t数据中心:" + info.getBucket().getLocation());
            System.out.println("\t创建时间:" + info.getBucket().getCreationDate());
            System.out.println("\t用户标志:" + info.getBucket().getOwner());
        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (ClientException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();
        }
        return info;
    }

    /**
     * 根据路径上传Object
     * @param fileKey
     * @param filePath
     * @return
     * @throws URISyntaxException
     */
    public String putObject(String fileKey, String filePath) throws URISyntaxException {
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        URL url = null;
        try {
            ossClient.putObject(bucketName, fileKey, new File(filePath));
            Date date = new Date();
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);// 设置起时间
            cal.add(Calendar.YEAR, 10);// 增加十年
            url = ossClient.generatePresignedUrl(bucketName, fileKey, cal.getTime());
            System.out.println("Object:" + fileKey + "存入OSS成功。" + "url为+++++++::" + url.toURI().toString());
        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (ClientException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();
        }
        return url.toURI().toString();
    }


    /**
     * 根据base64加密后的图片生成的字符串进行上传
     * @param fileKey
     * @param base64ImageString
     * @param compressFloat 
     * @return 上传后的路径
     * @throws URISyntaxException
     */
    public String putObject(String fileKey, String base64ImageString, Float compressFloat) throws URISyntaxException {
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        URL url = null;
        try {
            // 将base64编码的文件转为输入流并上传到阿里云服务器
            byte[] asBytes = Base64.getDecoder().decode(base64ImageString);
            for (int i = 0; i < asBytes.length; ++i) {
                if (asBytes[i] < 0) {// 调整异常数据
                    asBytes[i] += 256;
                }
            }
            System.out.println("asBytes:" + asBytes.toString());
            InputStream input = new ByteArrayInputStream(asBytes);
            System.out.println("input:" + input);
            OutputStream outputStream = OSSServiceImpl.compressPictures(input, compressFloat);
            InputStream inputStream = OSSServiceImpl.parse(outputStream);
            ossClient.putObject(bucketName, fileKey, inputStream);
            inputStream.close();
            outputStream.close();
            // 设置访问路径过期时间
            Date date = new Date();
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);// 设置起时间
            cal.add(Calendar.YEAR, 10);// 设置url过期时间为十年
            // 获取路径
            url = ossClient.generatePresignedUrl(bucketName, fileKey, cal.getTime());
            System.out.println("Object:" + fileKey + "存入OSS成功。" + "url为+++++++::" + url.toURI().toString());
        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (ClientException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();
        }
        return url.toURI().toString();
    }

    /**
     * 根据输入流压缩图片,返回输出流
     * @param inputStream
     * @param compressFloat
     * @return OutputStream
     * @throws IOException
     */
    public static OutputStream compressPictures(InputStream inputStream, Float compressFloat) throws IOException {
        ByteArrayOutputStream returnInputStream = new ByteArrayOutputStream();
        Thumbnails.of(inputStream).scale(1f).outputQuality(compressFloat).toOutputStream(returnInputStream);
        return returnInputStream;
    }

    /**
     * 根据路径压缩图片
     * @param originalStringPath
     * @param compressFloat
     * @return
     * @throws IOException
     */
    public static String compressPictures(String originalStringPath, Float compressFloat, String returnPath)
            throws IOException {
        String returnPathString = returnPath;
        Thumbnails.of(originalStringPath).scale(1f).outputQuality(compressFloat).toFile(returnPath);
        return returnPathString;
    }

    /**
     * 将输出流转为输出流
     * @param out
     * @return
     * @throws Exception
     */
    public static ByteArrayInputStream parse(OutputStream out) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        baos = (ByteArrayOutputStream) out;
        ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());
        baos.close();
        return swapStream;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37804737/article/details/81355076