OSS 根据ossKey直接获取base64

2022-06-06  本文已影响0人  一介书生独醉江湖
# 问题描述:
# 公司里面的很多实现都是先下载到本地,再将其转化为base64,感觉很别扭,毕竟有本地目录牵扯进来,硬盘容量、目录权限都有出错的可能,特别是在项目迁移或重新部署时;
# 这里的实现是根据ossKey去阿里云获取完整的临时访问路径,再通过读取访问路径、获取流、转化为base64;
1) pom依赖;
        <!--oss依赖-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.8.0</version>
        </dependency>
        <!--oss依赖-->
2) 获取OSSClient的实例,并取文件的临时受权访问路径;
import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.Protocol;

import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Date;

/**
 * @Author ds
 */
public class OssHelper {

    // 阿里云 AccessKey ID
    private static final String ACCESSKEYID = "Your AccessKey ID";
    // 阿里云 AccessKey Secret
    private static final String ACCESSKEYSECRET = "Your AccessKey Secret";
    // OSS存储空间名称
    private static final String ENDPOINT = "Your endPoint";
    // OSS访问域名(外网)
    private static final String BUCKETNAME = "Your bucketName";

    /**
     * 获取OSSClient实例
     * @return
     */
    public static OSSClient createOSSClient() {
        CredentialsProvider credsProvider = new DefaultCredentialProvider(ACCESSKEYID, ACCESSKEYSECRET);
        ClientConfiguration config = new ClientConfiguration();
        config.setProtocol(Protocol.HTTPS);
        OSSClient client = new OSSClient(ENDPOINT, credsProvider, config);
        return client;
    }
    /**
     * 取文件的临时受权访问路径
     *
     * @param objectName
     * @return
     */
    public static String ossUrl(String objectName) throws UnsupportedEncodingException {
        // 创建OSSClient实例
        OSSClient ossClient = OssHelper.createOSSClient();
        // 设置URL过期时间为2小时
        Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000 * 2);
        // 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
        URL url = ossClient.generatePresignedUrl(BUCKETNAME, objectName, expiration);
        String decode = URLDecoder.decode(String.valueOf(url), "UTF-8");
        decode = decode.replaceAll("\\+", "%2b");
        // 关闭OSSClient
        ossClient.shutdown();
        return decode;
    }
}
3) 根据url获取base64;
import sun.misc.BASE64Encoder;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @Author ds
 */
public class Base64Utils {

    public static String getBase64ByUrl(String fileUrl) {
        String base64String = "";
        try {
            //new一个URL对象
            URL url = new URL(fileUrl);
            //打开链接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //设置请求方式为"GET"
            conn.setRequestMethod("GET");
            //超时响应时间为5秒
            conn.setConnectTimeout(5 * 1000);
            //通过输入流获取图片数据
            InputStream inStream = conn.getInputStream();
            //得到图片的二进制数据,以二进制封装得到数据,具有通用性
            byte[] data = readInputStream(inStream);
            BASE64Encoder encode = new BASE64Encoder();
            base64String = encode.encode(data);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return base64String;
    }

    private static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        //创建一个Buffer字符串
        byte[] buffer = new byte[1024];
        //每次读取的字符串长度,如果为-1,代表全部读取完毕
        int len = 0;
        //使用一个输入流从buffer里把数据读取出来
        while ((len = inStream.read(buffer)) != -1) {
            //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
            outStream.write(buffer, 0, len);
        }
        //关闭输入流
        inStream.close();
        //把outStream里的数据写入内存
        return outStream.toByteArray();
    }

}
4) 测试;
/**
 * @Author ds
 */
public class OssTest {

    public static void main(String[] args){
        try {
            String base64Str = Base64Utils.getBase64ByUrl(OssHelper.ossUrl("60f606b79ce64ce184c4bf034bb87277.pdf"));
            System.out.println("******* start *****");
            System.out.println("base64 : " + base64Str.substring(0,100));
            System.out.println("******* end *****");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}
# 输出:
******* start *****
base64 : JVBERi0xLjcKJeLjz9MKMSAwIG9iago8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9Gb3JtL1Jlc291
cmNlczw8L0ZvbnQ8PC9TVFN
******* end *****
上一篇下一篇

猜你喜欢

热点阅读