使用联通云OSS小程序直传
生活随笔
收集整理的這篇文章主要介紹了
使用联通云OSS小程序直传
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 前言
- 一、對象存儲OSS?
- 二、使用步驟
- 1.POM引入
- 2.對象上傳
- 3.關(guān)于AK和SK的獲取
- 4.關(guān)于微信小程序直傳
- 總結(jié)
前言
因為給某市做一個核酸預(yù)約登記掃碼的防疫系統(tǒng)需要和聯(lián)通合作,采用了聯(lián)通云的對象存儲技術(shù),希望能給使用聯(lián)通OSS的小伙伴們踩個坑。
一、對象存儲OSS?
對象存儲產(chǎn)品(Object Storage Service,簡稱 OSS),是提供的海量、安全、低成本、高可靠的云存儲服務(wù)。
二、使用步驟
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");// 創(chuàng)建OSSClient實例。AmazonS3 amazonS3 = new AmazonS3Client(basicAWSCredentials);// 設(shè)置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)) {// 創(chuàng)建桶實例(容器, 無需重復(fù)創(chuàng)建)amazonS3.createBucket(bucketName);}// 創(chuàng)建對象請求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);// 設(shè)置讀寫權(quán)限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.關(guān)于AK和SK的獲取
登陸聯(lián)通云,進入控制臺,當(dāng)時找了好久才發(fā)現(xiàn),鏈接這么小!!!
4.關(guān)于微信小程序直傳
因為我們做的是微信小程序,考慮到帶寬和安全問題,不考慮服務(wù)端上傳而采用微信小程序直傳。
聯(lián)通云OSS官方文檔
https://www.cucloud.cn/document.html?id=572&arcid=1
此時小程序端需要向應(yīng)用服務(wù)端獲取簽名,獲取簽名方法詳見
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);}}總結(jié)
聯(lián)通云OSS對象存儲的官方文檔還有待完善(很多地方其實是有出入的),最后都是翻閱亞馬遜S3的文檔、阿里云OSS文檔和聯(lián)系聯(lián)通云的技術(shù)專家解決的。
總結(jié)
以上是生活随笔為你收集整理的使用联通云OSS小程序直传的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZY Player 2.8.1 中文版
- 下一篇: Abaqus 2016基础操作到高级接触