美文网首页
OSS 根据ossKey直接获取base64

OSS 根据ossKey直接获取base64

作者: 一介书生独醉江湖 | 来源:发表于2022-06-06 18:38 被阅读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 *****
    

    相关文章

      网友评论

          本文标题:OSS 根据ossKey直接获取base64

          本文链接:https://www.haomeiwen.com/subject/seiemrtx.html