使用联通云OSS小程序直传
文章目录
- 前言
- 一、对象存储OSS?
- 二、使用步骤
- 1.POM引入
- 2.对象上传
- 3.关于AK和SK的获取
- 4.关于微信小程序直传
- 总结
前言
因为给某市做一个核酸预约登记扫码的防疫系统需要和联通合作,采用了联通云的对象存储技术,希望能给使用联通OSS的小伙伴们踩个坑。
一、对象存储OSS?
对象存储产品(Object Storage Service,简称 OSS),是提供的海量、安全、低成本、高可靠的云存储服务。
二、使用步骤
1.POM引入
引入亚马逊aws依赖:
<dependency><groupId>com.amazonaws</groupId><artifactId>aws-java-sdk</artifactId><version>1.11.24</version></dependency>
2.对象上传
代码如下(示例):
// 此处的AK和SK填写自己的BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials("accessKey", "secretKey");// 创建OSSClient实例。AmazonS3 amazonS3 = new AmazonS3Client(basicAWSCredentials);// 设置endpointamazonS3.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生成签名代码部分
/*** 获取oss认证签名* @author DdogRing* @date 2022/4/13 0013 16:21* @param* @return java.util.Map<java.lang.String,java.lang.Object>*/public Map<String, Object> 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);// 生成policyString 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<String, Object> res = new HashMap<>();res.put("accessKeyId", "accessKey");res.put("encodePolicy", encodePolicy);res.put("signature", signature);res.put("filename", objectName);return res;}/*** 计算签名* @author DdogRing* @date 2022/4/13 0013 16:22* @param key accessKeySecret* @param data base64后的policy* @return java.lang.String*/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文档和联系联通云的技术专家解决的。
使用联通云OSS小程序直传相关推荐
- 对象存储OSS(微信小程序直传实践)
对象存储OSS(微信小程序直传实践) 一.配置Bucket跨域访问 客户端进行表单直传到OSS时,会从浏览器向OSS发送带有Origin的请求消息.OSS对带有Origin头的请求消息会进行跨域规则( ...
- 联通云OSS上传文件
第一步:首先准备沃云账号 AccessKeyId和AccessKeySecret 第二步:导入maven依赖 <dependency><groupId>com.amazonaw ...
- 微信小程序直传腾讯云COS并对图片持久化文字水印案例
大家好,我是前端发现者https://blog.csdn.net/Smell_rookie,是一名页面仔工程师,我会不定时在CSDN更新我的博客,有兴趣的可以点个关注来逛逛我的主页. 写这个需求时网上 ...
- 前端阿里云OSS直传,微信小程序版本
前言: 网络上许多的文章资料,全是使用阿里云官方的SDK,ali-oss插件去做直传.可是各位素未谋面的朋友要注意,这个SDK它支持web环境使用,也就是PC端浏览器. 当项目环境切换到微信小程序,是 ...
- 微信小程序:阿里云OSS直传实践-PHP实现服务端签名
目录 1.阿里云OSS上传方式 1.1.Web端Browser.js SDK直传(不推荐) 1.2.Web端上传服务端再上传至OSS 1.3.服务端签名后Web端直传(推荐) 2.PHP服务端生成签名 ...
- 微信小程序录音直传阿里云OSS并语音识别
前言 如题:做一个录音文字识别功能,知识点有三个,分别是微信小程序的录音功能.录音文件直传阿里云OSS.使用阿里云的录音文件识别接口返回识别后的文字 一.微信小程序录音 官方文档:微信小程序全局唯一的 ...
- uniapp微信小程序外壳内联H5实现支付
业务场景:用户有现成的微信H5应用(有微信支付).用户想要一个一摸一样的小程序版本,但是又不想高成本去重新开发,所以可以考虑采用小程序的web-view组件内联现有的微信H5应用(哇简直不要再偷懒了! ...
- 微信小程序+阿里物联/Onenet物联+esp32搭建无服务器物联系统(一)---ESP32硬件设计开源
目录 简介 一.硬件设计开源连接 二.硬件设计解析 1.电路原理图 2.PCB版图 3.BOM资料 4.整体项目的资料连接 微信小程序+阿里物联平台+合宙Air724UG搭建无服务器物联系统(一) 微 ...
- 前端上传图片到阿里云(pc端和uniapp小程序)
1.pc端直接传文件 官方文档JavaScript客户端签名直传 如果前端是原生的html写的话,就去官网下载示例来看,把文件里面的配置修改成子阿里云的配置就好 ![在这里插入图片描述](https: ...
最新文章
- wps office oa控件 痕迹_WPS大更新,Office的付费功能免费用,我不会是最后一个知道的吧?...
- pdf格式怎么转换成word格式
- 国内Linux shell,管理你的 shell 环境 | Linux 中国
- QNNPACK高性能前向内核库全面剖析——引言篇
- OpenCV中Mat的属性
- odd raio值 是什麼_乳化油相所需的HLB值
- js+jquery手写弹出提示框
- 在linux下 用户的密码错误,linux – 常规用户帐户之间的su失败,“su:密码错误”...
- SQL那些事儿(七)--oracle表空间、用户查看基本语句
- Go语言实现线程安全访问队列
- html 文本框 p,Javascript实现HTML表单form多个HttpPost请求
- 现有VI 创建子VI(LabVIEW软件)
- C语言学习-翁凯(第十章笔记)
- 阿里云物联网平台体验(树莓派+Python篇) 1
- 严格执行8小时工作制、双休,会怎样?
- 每日新闻丨五方面推动云计算产业发展;字节跳动与澎湃合资成立视听科技
- 计算机二级access分数分布_全国计算机等级考试2017年上半年二级ACCESS数据库成绩查询...
- 什么是“热门”,短语是从哪里来的?
- 英语单词总结10/7
- gmail邮箱在OUTLOOK中的设置