栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

使用联通云OSS小程序直传

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用联通云OSS小程序直传

文章目录
  • 前言
  • 一、对象存储OSS?
  • 二、使用步骤
    • 1.POM引入
    • 2.对象上传
    • 3.关于AK和SK的获取
    • 4.关于微信小程序直传
  • 总结


前言

因为给某市做一个核酸预约登记扫码的防疫系统需要和联通合作,采用了联通云的对象存储技术,希望能给使用联通OSS的小伙伴们踩个坑。


一、对象存储OSS?

对象存储产品(Object Storage Service,简称 OSS),是提供的海量、安全、低成本、高可靠的云存储服务。

二、使用步骤 1.POM引入

引入亚马逊aws依赖:

	
            com.amazonaws
            aws-java-sdk
            1.11.24
    
2.对象上传

代码如下(示例):

		// 此处的AK和SK填写自己的
 		BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials("accessKey", "secretKey");

        // 创建OSSClient实例。
        AmazonS3 amazonS3 = new AmazonS3Client(basicAWSCredentials);
        // 设置endpoint
        amazonS3.setEndpoint("https://obs-jsnj.woyun.cn");

        S3ClientOptions s3ClientOptions = S3ClientOptions.builder().setPathStyleAccess(true).setPayloadSigningEnabled(true).build();
        amazonS3.setS3ClientOptions(s3ClientOptions);

        // 桶名称
        String bucketName = "demo";

        try {

            
            String objectKey = "甘雨神里.jpg";
            File file = new File("/Users/ddogring/Pictures/甘雨神里.jpeg");
            String fileName = file.getName();
            objectKey = String.format(objectKey, fileName);
            // 判断桶是否存在
            if (!amazonS3.doesBucketExist(bucketName)) {
                // 创建桶实例(容器, 无需重复创建)
                amazonS3.createBucket(bucketName);
            }
            // 创建对象请求
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, file);
            
            // 也可以文件流方式上传
            // InputStream is = new FileInputStream(file);
            // ObjectMetadata metadata =  new ObjectMetadata();
            // metadata.setContentType(fileName);
            // PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, is, metadata);
            
            // 设置读写权限
            putObjectRequest.withCannedAcl(CannedAccessControlList.Private);
            // 提交对象
            PutObjectResult result = amazonS3.putObject(putObjectRequest);

            if (Objects.nonNull(result)){
                System.out.println("result:=============================================================");
                System.out.println("result.getContentMd5():"+result.getContentMd5());
                System.out.println("result.getETag():"+result.getETag());
                System.out.println("result.getMetadata():"+result.getMetadata());
                System.out.println("result.getVersionId():"+result.getVersionId());
                System.out.println("result.getExpirationTimeRuleId():"+result.getExpirationTimeRuleId());
                System.out.println("result.getExpirationTime():"+result.getExpirationTime());
            }
        } catch (Exception e){
            e.printStackTrace();
        }

3.关于AK和SK的获取

登陆联通云,进入控制台,当时找了好久才发现,链接这么小!!!

4.关于微信小程序直传

因为我们做的是微信小程序,考虑到带宽和安全问题,不考虑服务端上传而采用微信小程序直传。

联通云OSS官方文档

https://www.cucloud.cn/document.html?id=572&arcid=1

此时小程序端需要向应用服务端获取签名,获取签名方法详见

https://www.jianshu.com/p/fbfb43b96829

以下是Java生成签名代码部分

	
    public Map getSignature() throws Exception {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        Calendar calendar = Calendar.getInstance();
        // policy有效期10分钟
        calendar.add(Calendar.MINUTE, - (8 * 60) + 10);
        Date time = calendar.getTime();
        String format = sdf.format(time);

        // 生成policy
        String policy = "{"expiration": ""+ format +"","conditions": [["eq","$bucket", ""

                + bucketName + "" ],["starts-with", "$key", "" + objectName

                + ""],["content-length-range", 0, 104857600],["eq","$Content-Type", "text/plain"],{"acl":""

                + CannedAccessControlList.Private +""}]}";

        // policy加密
        String encodePolicy = new String(Base64.getEncoder().encode(policy.getBytes()));
        // 计算签名
        String signature = computeSignature(accessKeySecret, encodePolicy);

        Map res = new HashMap<>();
        res.put("accessKeyId", "accessKey");
        res.put("encodePolicy", encodePolicy);
        res.put("signature", signature);
        res.put("filename", objectName);
        return res;

    }
    
	
    public String computeSignature(String key, String data) {

        try {

            byte[] signData = sign(key.getBytes(DEFAULT_ENCODING), data.getBytes(DEFAULT_ENCODING), macInstance, LOCK,

                    ALGORITHM);

            return BinaryUtils.toBase64(signData);

        } catch (UnsupportedEncodingException ex) {

            throw new RuntimeException("Unsupported algorithm: " + DEFAULT_ENCODING, ex);

        }

    }

    protected byte[] sign(byte[] key, byte[] data, Mac macInstance, Object lock, String algorithm) {

        try {

            if (macInstance == null) {

                synchronized (lock) {

                    if (macInstance == null) {

                        macInstance = Mac.getInstance(algorithm);

                    }

                }

            }

            Mac mac;

            try {

                mac = (Mac) macInstance.clone();

            } catch (CloneNotSupportedException e) {

                mac = Mac.getInstance(algorithm);

            }

            mac.init(new SecretKeySpec(key, algorithm));

            return mac.doFinal(data);

        } catch (NoSuchAlgorithmException ex) {

            throw new RuntimeException("Unsupported algorithm: " + algorithm, ex);

        } catch (InvalidKeyException ex) {

            throw new RuntimeException("Invalid key: " + key, ex);

        }

    }

总结

联通云OSS对象存储的官方文档还有待完善(很多地方其实是有出入的),最后都是翻阅亚马逊S3的文档、阿里云OSS文档和联系联通云的技术专家解决的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/872598.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号