华为云OBS配置及Java代码访问

2023-10-27

maven依赖

   <dependency>
        <groupId>com.huaweicloud</groupId>
        <artifactId>esdk-obs-java</artifactId>
        <version>3.20.6.1</version>
    </dependency>

yml文件中的配置

#新华为云OSS配置
huaweiobs:
endPoint: https://obs.*****.myhuaweicloud.com
ak: *************
sk: ***************
bucketName: ***********

工具类

package cn.com.yuanquanyun.utils.upload;

import cn.com.jit.cloud.common.MD5Util;
import cn.com.yuanquanyun.common.utils.HmacSha1Util;
import cn.com.yuanquanyun.common.utils.sign.Base64;
import cn.com.yuanquanyun.utils.Des3Util;
import cn.hutool.core.io.IoUtil;
import com.obs.services.model.ObjectMetadata;
import com.obs.services.ObsClient;
import com.obs.services.model.HttpMethodEnum;
import com.obs.services.model.ObsObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 华为云OBS
 */
@Component
public class OSSUtil {
    static String endPoint;
    static String ak;
    static String sk;
    static String bucketName;
    private final static String KEY_MD5 = "x-obs-meta-plain-md5";

    @Value("${huaweiobs.endPoint}")
    public void setEndPoint(String endPoint) {
        OSSUtil.endPoint = endPoint;
    }
    @Value("${huaweiobs.ak}")
    public void setAk(String ak) {
        OSSUtil.ak = ak;
    }
    @Value("${huaweiobs.sk}")
    public void setSk(String sk) {
        OSSUtil.sk = sk;
    }
    @Value("${huaweiobs.bucketName}")
    public void setBucketName(String bucketName) {
        OSSUtil.bucketName = bucketName;
    }


    public static void upload(String objectName, byte[] content) throws IOException {
        ObsClient obsClient = null;
        try{
            // 构建metadata对象参数
            ObjectMetadata objectMetadata = genMetadata(null, content);
            // 创建ObsClient实例
            obsClient = new ObsClient(ak, sk, endPoint);
            // 使用访问OBS
            obsClient.putObject(bucketName, objectName, new ByteArrayInputStream(Des3Util.encodeBytes(content)),objectMetadata);//带MD5校验
            //obsClient.putObject(bucketName, objectName, new ByteArrayInputStream(Des3Util.encodeBytes(content)));//上传文件时不带MD5,那么下载时,也就不用校验MD5.
            // 关闭obsClient
            obsClient.close();
        }catch (Exception ex){

        }finally {
            if(obsClient != null)
                obsClient.close();
        }

    }

    public static String getUrl(String objectName) {
        // 创建ObsClient实例
        ObsClient obsClient = new ObsClient(ak, sk, endPoint);
        Date expiryTime = new Date(System.currentTimeMillis() + 3600 * 1000);
        String url = obsClient.createSignedUrl(HttpMethodEnum.getValueFromStringCode("GET"),bucketName, objectName, null,expiryTime,null,null);
        return url;
    }


    public static byte[] downloadByte(String objectName) {
        ObsClient obsClient = null;
        try{
            // 创建ObsClient实例
            obsClient = new ObsClient(ak, sk, endPoint);

            ObsObject obsObject = obsClient.getObject(bucketName, objectName);

            InputStream inputStream = obsObject.getObjectContent();
            byte[] content = getBytes(inputStream);
            byte[] decodeBytes = Des3Util.decodeBytes(content);
            return decodeBytes;
        }catch (Exception ex){
            System.err.println(ex);
        } finally {
            if(obsClient != null)
                try{
                    obsClient.close();
                }catch (Exception ex){
                    System.err.println(ex);
                }

        }
        return null;
    }

    public static byte[] getBytes(InputStream fis) {
        byte[] buffer = null;
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] b = new byte[1024];
            int n;
            while ((n = fis.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            fis.close();
            bos.close();
            buffer = bos.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer;
    }

    public static void deleteLoad(String fileAddress) {
        ObsClient obsClient = null;
        try{
            // 创建ObsClient实例
            obsClient = new ObsClient(ak, sk, endPoint);
            obsClient.deleteObject(bucketName,fileAddress);
        }catch (Exception ex){
            System.err.println(ex);
        } finally {
            if(obsClient != null)
                try{
                    obsClient.close();
                }catch (Exception ex){
                    System.err.println(ex);
                }

        }

    }

    public static String downloadBase64(String objectName) throws IOException {
        ObsClient obsClient = null;
        try{
            // 创建ObsClient实例
            obsClient = new ObsClient(ak, sk, endPoint);

            ObsObject obsObject = obsClient.getObject(bucketName, objectName);

            InputStream inputStream = obsObject.getObjectContent();
            byte[] content = getBytes(inputStream);
            byte[] decodeBytes = Des3Util.decodeBytes(content);
            // MD5 校验 开始
            String savedMd5 = obsObject.getMetadata().getMetadata().get(KEY_MD5).toString();
            System.out.println("savedMd5=="+savedMd5);
            if (StringUtils.isNotBlank(savedMd5)) {
                //
                String calMd5 = MD5Util.MD5(decodeBytes);
                if (!savedMd5.equals(calMd5)) {
                    System.out.println("校验失败!");
                    throw new Exception(objectName + " 数据对象完整性校验失败");
                }else {
                    System.out.println("校验成功!");
                }
            }
            // MD5 校验 开始
            return Base64.encode(decodeBytes);
        }catch (Exception ex){
            System.err.println(ex);
        } finally {
            if(obsClient != null)
                try{
                    obsClient.close();
                }catch (Exception ex){
                    System.err.println(ex);
                }

        }
        return null;
    }

    public static boolean objectExist(String objectName){
        ObsClient obsClient = null;
        try{
            // 创建ObsClient实例
            obsClient = new ObsClient(ak, sk, endPoint);
            boolean exist = obsClient.doesObjectExist(bucketName, objectName);
            obsClient.close();
            return exist;
        }catch (Exception ex){
            System.err.println(ex);
        } finally {
            if(obsClient != null)
                try{
                    obsClient.close();
                }catch (Exception ex){
                    System.err.println(ex);
                }
        }
        return false;
    }

    /**
     * 构建OSS对象属性信息,并对原文做MD5
     *
     * @param map
     * @return
     * @throws Exception
     */
    private static ObjectMetadata genMetadata(Map<String, String> map, byte[] content) {
        // ADD MD5
        if (map == null) {
            map = new HashMap<>();
        }
        String md5val = MD5Util.MD5(content);
        map.put(KEY_MD5, md5val);
        ObjectMetadata objectMetadata = new ObjectMetadata();
        for (Map.Entry<String, String> entry : map.entrySet()) {
            String mapKey = entry.getKey();
            String mapValue = entry.getValue();
            objectMetadata.addUserMetadata(mapKey, mapValue);
        }
        return objectMetadata;
    }

}

package cn.com.yuanquanyun.utils;
import cn.com.yuanquanyun.common.utils.Base64;
import org.apache.commons.lang3.StringUtils;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.lang.reflect.Field;
import java.security.Key;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


public class Des3Util {

    // 向量
    private final static String iv = "097889273";
    // 加解密统一使用的编码方式
    private final static String encoding = "UTF-8";
    // 加密key TODO 做一下非对称的加密
    private final static String secretKey = "dhfkdhdfkliieirtutuj";

    /**
     * 3DES加密
     *
     * @param plainText 普通文本
     * @return
     * @throws Exception
     */
    public static String encode(String plainText) {
        try {
            if (StringUtils.isBlank(plainText)) {
                return plainText;
            }
            Key deskey = null;
            DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
            SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
            deskey = keyfactory.generateSecret(spec);

            Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
            IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
            cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
            byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));
            return Base64.encodeBytes(encryptData);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return plainText;
    }

    /**
     * 3DES解密
     *
     * @param encryptText 加密文本
     * @return
     * @throws Exception
     */
    public static String decode(String encryptText) {
        try {
            if (StringUtils.isBlank(encryptText)) {
                return encryptText;
            }
            Key deskey = null;
            DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
            SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
            deskey = keyfactory.generateSecret(spec);
            Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
            IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, deskey, ips);

            byte[] decryptData = cipher.doFinal(Base64.decode(encryptText));
            return new String(decryptData, encoding);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return encryptText;
    }


    /**
     * 3DES加密
     *
     * @param plainText 普通文本,加密文本为字节数组
     * @return 返回加密后的字节数组
     * @throws Exception
     */
    public static byte[] encodeBytes(byte[] plainText) {
        try {
            if (plainText == null) {
                return null;
            }
            Key deskey = null;
            DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
            SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
            deskey = keyfactory.generateSecret(spec);

            Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
            IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
            cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
            byte[] encryptData = cipher.doFinal(plainText);
            return encryptData;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return plainText;
    }

    /**
     * 3DES解密
     *
     * @param encryptText 加密文本,byte[] 为加密原文未经过任何转码
     * @return
     * @throws Exception
     */
    public static byte[] decodeBytes(byte[] encryptText) {
        try {
            if (encryptText == null) {
                return null;
            }
            Key deskey = null;
            DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
            SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
            deskey = keyfactory.generateSecret(spec);
            Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
            IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, deskey, ips);

            byte[] decryptData = cipher.doFinal(encryptText);
            return decryptData;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return encryptText;
    }


    /**
     * 对listMap中的指定字段进行解密
     *
     * @param listMap
     * @return
     */
    public static List<Map<String, Object>> decodeListMap(List<Map<String, Object>> listMap, String... keys) {
        if (listMap != null && listMap.size() > 0 && keys != null && keys.length > 0) {
            for (Map<String, Object> map : listMap) {
                for (int i = 0; i < keys.length; i++) {
                    String key = keys[i];
                    map.put(key, decode((String) map.get(key)));
                }
            }
        }
        return listMap;
    }

    /**
     * 对listMap中的指定字段进行解密
     *
     * @param map
     * @return
     */
    public static Map<String, Object> decodeMap(Map<String, Object> map, String... keys) {
        if (map != null && keys != null && keys.length > 0) {
            for (int i = 0; i < keys.length; i++) {
                String key = keys[i];
                map.put(key, decode((String) map.get(key)));
            }
        }
        return map;
    }

    /**
     * 解密List下对象指定的属性值
     *
     * @param listBean
     * @param keys
     */
    public static <T> List<T> decodeListBean(List<T> listBean, String... keys) {
        if (listBean != null && listBean.size() > 0 && keys != null && keys.length > 0) {
            for (T bean : listBean) {
                decodeBean(bean, keys);
            }
        }
        return listBean;
    }

    /**
     * 解密List下对象指定的属性值
     *
     * @param bean
     * @param keys
     */
    public static <T> T decodeBean(T bean, String... keys) {
        if (bean!= null && keys != null && keys.length > 0) {
            Class<?> bc = bean.getClass();
            for (int i = 0; i < keys.length; i++) {
                Field field = null;
                try {
                    field = bc.getDeclaredField(keys[i]);
                    field.setAccessible(true);
                    String val = (String) field.get(bean);
                    field.set(bean, decode(val));
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return bean;
    }


    private String aa;

    public String getAa() {
        return aa;
    }

    public void setAa(String aa) {
        this.aa = aa;
    }

    public static void main(String[] args) {

        String text = "17600198405";
        String encryptData = encode(text);
        System.out.println("原始字符串:" + text);
        System.out.println("加密后的值:" + encryptData);


        //
        String jiami = "G/JhLvch4w22Wgn1kRQ334i23migvMZa";
        String decryptorData = decode(jiami);
        System.out.println("解密字符串:" + jiami);
        System.out.println("解密后的值:" + decryptorData);

        List<Des3Util> list  = new ArrayList<>();
        Des3Util d = new Des3Util();
        d.setAa("aWGVfeAnVO9QSN0ZXRZ46f3/apZOOuZP");
        list.add(d);
        decodeListBean(list, "aa");
        System.out.println(d.getAa());


        String temp = "R0uiBsi9kEY=";
        System.out.println(temp.split(",").length);

    }

}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

华为云OBS配置及Java代码访问 的相关文章

随机推荐

  • 小波分析 + 支持向量机(SVM)预测股票涨跌幅的实现

    刚刚开始进入量化投资领域 最近在做金融数据方面的预测 用到了数据挖掘的知识 花了大概半个月的时间搞懂研报的思想 学习研报中提到的数据处理和机器学习算法 并实现了这个量化投资的核心模型部分 虽然结果显示这个方法没有多好 但是在这期间 我遇到了
  • IOS图片生成工具(@1X,@2X,@3X)

    IOS图片生成工具 1X 2X 3X 在进行IOS开发过程中 经常需要为了适配不同分辨率的设备而准备不同尺寸的图片 由于本人长期从事后台研发工作 对前端及UI常用工具 比如PS 并不熟悉 于是开发了下面这个工具对一个大尺寸的图片进行裁剪 生
  • 数据结构我好爱:链表作业->静态链表的插入与删除

    就以SDD个人的看法来说 静态链表与我们传统正常的单链表区别不大 我们可以想作正常的单链表即可 只是电脑帮助你分配了一块空间 然后你快乐地使用 取地址从而进行连接 它的地址是16位制的 而静态链表就纯靠个人 首先你去malloc一块空间 然
  • phpMyAdmin设置session过期时间方法

    本文转载自 https www fujieace com mysql session gc maxlifetime html 我们在用phpmyadmin登录后1440秒未活动后总是自动退出 提示 登陆超时 1440秒未活动 请重新登录 如
  • Unity3D -- Hit UFO

    目录 一 游戏内容 二 UML图 三 游戏的实现 1 DiskFactory 2 SSAction 3 SSActionManager 4 ISceneController 5 UserGUI 6 自定义组件 四 运行界面与代码传送门 五
  • WebSocket的理解以及应用场景

    文章目录 一 对 WebSocket 的理解 二 Websocket的使用方法如下 三 应用场景 一 对 WebSocket 的理解 WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术 属于应用层协议 它基于TC
  • ajax 控制器返回数组,从浏览器中的javascript传递数组数据到使用ajax弹出mvc控制器...

    Vivin Paliat 32 你可以从JavaScript方面做到这一点 ajax type POST url myurl data myArray a notice that myArray matches the value for
  • Mysql安装和Navicat安装的步骤和出现的问题汇总

    Mysql安装过程 1 下载准备 首先需要准备下载Mysql和其图形化界面Navicat Mysql下载路径 选择zip下载就好 Navicat下载路径 2 Mysql安装 将下载好的zip解压到你要的文件夹中 配置好环境变量Path 路径
  • 循环队列的操作

    数据结构 严蔚敏 队列的顺序存储结构 循环队列 收藏 include stdafx h c1 h 程序名 include
  • [QT]moc生成文件分析

    首先看一下简单含有的signal slot代码 cpp view plain copy class myClass public QObject Q OBJECT public myClass myClass void trigger vo
  • 基于springboot人事管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SpringBoot 前端 Vue 数据库 MySQL5 7和Navicat管理工具结合 开发软件 IDEA Eclipse 是否Maven项目 是 前言 基于sp
  • LeetCode1047. 删除字符串中的所有相邻重复项

    1047 删除字符串中的所有相邻重复项 给出由小写字母组成的字符串 S 重复项删除操作会选择两个相邻且相同的字母 并删除它们 在 S 上反复执行重复项删除操作 直到无法继续删除 在完成所有重复项删除操作后返回最终的字符串 答案保证唯一 输入
  • jacob操作word增加表格 行列

    import com jacob activeX ActiveXComponent import com jacob com Dispatch import com jacob com Variant import com jacob co
  • leetcode线程题1116——打印零与奇偶数

    直接考虑信号量解决问题 输出完奇数偶数 释放输出0所需的信号量 对于本题没有想到的地方是调用过程 原代码编写的没有自己加入for循环 以为三个线程会不停被调用 一直不过 只输出 01 就结束了 根本没有循环起来 include
  • AIX 用户和组管理

    参考http www ibm com developerworks cn aix library au aixuseradmin 管理 IBM AIX 中的用户和组是管理员的重要责任之一 可以以许多种方式管理用户和组 可以通过 AIX Sy
  • Eigen中编译内联对效率的影响

    Eigen在src Core util Macros h中定义了 EIGEN STRONG INLINE EIGEN ALWAY INLINE EIGEN DONT INLINE 其中EIGEN STRONG INLINE在MSVC和ICC
  • Idea使用技巧

    很久没有写博客了啊 小小的程序猿爱因斯蛋忙于学习 最近学完了Spring SpringMVC SSM整合 SpringBoot一直在学 也敲了很多代码 出了很多错 改进了idea很多东西让我敲代码变得更加的舒坦 现在我给带来一些使用idea
  • 怎么设置html禁止直接打开,如何禁止网页自动跳转

    1 首先打开ie浏览器 点击菜单栏上的 工具 按钮 从弹出的菜单中选择 Internet选项 2 从弹出的 Internet选项 对话框中选择 安全 选项卡 并在 选择要查看的区域或更改安全设置 下方的窗口中选中 Internet 单击下方
  • 使用开源实时监控系统 HertzBeat 5分钟搞定 Mysql 数据库监控告警

    使用开源实时监控系统 HertzBeat 对 Mysql 数据库监控告警实践 5分钟搞定 Mysql 数据库介绍 MySQL是一个开源关系型数据库管理系统 由瑞典MySQL AB 公司开发 属于 Oracle 旗下产品 MySQL 是最流行
  • 华为云OBS配置及Java代码访问

    文章目录 maven依赖 yml文件中的配置 工具类 maven依赖