當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Boot——集成七牛云OSS对象存储SDK解决方案
生活随笔
收集整理的這篇文章主要介紹了
Spring Boot——集成七牛云OSS对象存储SDK解决方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基本概念?
七牛云OSS對象存儲(Kodo):七牛云海量存儲系統(Kodo)是自主研發的非結構化數據存儲管理平臺,支持中心和邊緣存儲。 平臺經過多年大規模用戶驗證已躋身先進技術行列,并廣泛應用于海量數據管理的各類場景。
官方文檔
對象存儲 Java SDK 更新時間:2019-12-16 17:24:24
Gradle?
compile 'com.qiniu:qiniu-java-sdk:7.2.27'Maven
<dependencies><dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>[7.2.0, 7.2.99]</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.2</version><scope>compile</scope></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.5</version><scope>compile</scope></dependency><dependency><groupId>com.qiniu</groupId><artifactId>happy-dns-java</artifactId><version>0.1.6</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version><scope>provided</scope></dependency></dependencies>準備工作?
?
1、七牛云注冊賬號
七牛云官網:https://www.qiniu.com/
2、創建bucket
3、記下倉庫名字和訪問域名
七牛融合 CDN 測試域名(以 clouddn.com/qiniucdn.com/qnssl.com/qbox.me 結尾),每個域名每日限總流量 10GB,每個測試域名自創建起30個自然日后系統會自動回收,僅供測試使用并且不支持 Https 訪問,詳情查看七牛測試域名使用規范。點擊下列域名可查看每個域名剩余回收時間。
4、設置頁面記錄AK和SK.
配置文件
application.properties
#QiNiu Config # 七牛云密鑰AK、SK qiniu.access-key=cuMAM_AWSSU2zNqc3VIIJdebyeYJ qiniu.secret-key=QmGmKdqiWJ6bHaGR3bj5Jdky2WOua # 七牛云空間名 qiniu.bucket-name=stzg # 外鏈訪問路徑 qiniu.domain=cdn.shentuzhigang.top # 機房 qiniu.region=huadongapplication.yml
# 七牛云配置------------------------------------ # 七牛云密鑰AK、SK qiniuAccessKey: 0CQcXKb0Mjti_WrxZTjxxSUNpbhtSecretKey: fWGgBM8ddddEgVR9JYqYHXjffdxx9V # 七牛云空間名Bucket: domain # 外鏈訪問路徑domain: blog.domain.comregion: huadong解決方案
配置類
package cn.edu.zstu.shihua.xihu.config;import com.google.gson.Gson; import com.qiniu.http.Client; import com.qiniu.storage.BucketManager; import com.qiniu.storage.Region; import com.qiniu.storage.UploadManager; import com.qiniu.util.Auth; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException;/*** @author ShenTuZhiGang* @version 1.0.0* @date 2020-07-29 20:27*/ @Configuration public class CustomQiNiuKodoConfig {@Value("${qiniu.access-key}")private String accessKey ;@Value("${qiniu.secret-key}")private String secretKey ;@Value("${qiniu.region}")private String region;/*** 華東機房,配置自己空間所在的區域*/@Beanpublic com.qiniu.storage.Configuration qiniuConfig()throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {Field[] fields = QiNiuRegion.class.getDeclaredFields();for(Field field:fields){String r = (String)field.get(QiNiuRegion.class);System.out.println(r);if(r.equals(region)){com.qiniu.storage.Configuration c = new com.qiniu.storage.Configuration((Region)Region.class.getMethod(r,null).invoke(null,null));return c;}}return new com.qiniu.storage.Configuration(Region.huadong());}/*** 構建一個七牛上傳工具實例*/@Beanpublic UploadManager uploadManager(com.qiniu.storage.Configuration c) {return new UploadManager(c);}/*** 認證信息實例* @return*/@Beanpublic Auth auth() {return Auth.create(accessKey, secretKey);}/**** @param c com.qiniu.storage.Configuration* @return*/@Beanpublic Client client(com.qiniu.storage.Configuration c){return new Client(c);}/*** 構建七牛空間管理實例* @param auth 認證信息* @param c com.qiniu.storage.Configuration* @return*/@Beanpublic BucketManager bucketManager(Auth auth,com.qiniu.storage.Configuration c) {return new BucketManager(auth, c);}/*** Gson* @return*/@Beanpublic Gson gson() {return new Gson();} }interface QiNiuRegion{String REGION_0 = "region0";String REGION_1 = "region1";String REGION_2 = "region2";String REGION_Na = "regionNa";String REGION_AS = "regionAs";String HUA_DONG = "huadong";String HUA_BEI = "huabei";String HUA_NAN = "huanan";String BRI_MEI = "beimei";String XIN_JIA_PO = "xinijipo"; }Provider
package cn.edu.zstu.shihua.xihu.provider; import com.google.gson.Gson; import com.qiniu.common.QiniuException; import com.qiniu.http.Client; import com.qiniu.http.Response; import com.qiniu.storage.BucketManager; import com.qiniu.storage.Configuration; import com.qiniu.storage.UploadManager; import com.qiniu.storage.model.DefaultPutRet; import com.qiniu.util.Auth; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder;/*** FileName: QiNiuProvider** @author ShenTuZhiGang* @version 1.0.0* @date 2020/7/19 21:20*/@Component public class QiNiuProvider {@Value("${qiniu.bucket-name}")private String bucketName ;@Value("${qiniu.domain}")private String fileDomain;@Autowiredprivate Configuration c;@Autowiredprivate UploadManager uploadManager;@Autowiredprivate BucketManager bucketManager;@Autowiredprivate Client client;@Autowiredprivate Gson gson;// 密鑰配置@Autowiredprivate Auth auth;//簡單上傳模式的憑證public String getUpToken() {return auth.uploadToken(bucketName);}//覆蓋上傳模式的憑證public String getUpToken(String fileKey) {return auth.uploadToken(bucketName, fileKey);}/*** 將本地文件上傳* @param filePath 本地文件路徑* @param fileKey 上傳到七牛后保存的文件路徑名稱* @return* @throws IOException*/public DefaultPutRet upload(String filePath, String fileKey) throws IOException {Response res = uploadManager.put(filePath, fileKey, getUpToken(fileKey));// 解析上傳成功的結果DefaultPutRet putRet = gson.fromJson(res.bodyString(), DefaultPutRet.class);System.out.println(putRet.key);System.out.println(putRet.hash);return putRet;}/*** 上傳二進制數據* @param data* @param fileKey* @return* @throws IOException*/public DefaultPutRet upload(byte[] data, String fileKey) throws IOException {Response res = uploadManager.put(data, fileKey, getUpToken(fileKey));// 解析上傳成功的結果DefaultPutRet putRet = gson.fromJson(res.bodyString(), DefaultPutRet.class);System.out.println(putRet.key);System.out.println(putRet.hash);return putRet;}/*** 上傳輸入流* @param inputStream* @param fileKey* @return* @throws IOException*/public DefaultPutRet upload(InputStream inputStream, String fileKey) throws IOException {Response res = uploadManager .put(inputStream, fileKey, getUpToken(fileKey),null,null);// 解析上傳成功的結果DefaultPutRet putRet = gson.fromJson(res.bodyString(), DefaultPutRet.class);System.out.println(putRet.key);System.out.println(putRet.hash);return putRet ;}/*** 刪除文件* @param fileKey* @return* @throws QiniuException*/public boolean delete(String fileKey) throws QiniuException {Response response = bucketManager.delete(bucketName, fileKey);return response.statusCode == 200 ? true:false;}/*** 獲取公共空間文件* @param fileKey* @return*/public String getFile(String fileKey) throws Exception{String encodedFileName = URLEncoder.encode(fileKey, "utf-8").replace("+", "%20");String url = String.format("%s/%s", fileDomain, encodedFileName);return url;}/*** 獲取私有空間文件* @param fileKey* @return*/public String getPrivateFile(String fileKey) throws Exception{String encodedFileName = URLEncoder.encode(fileKey, "utf-8").replace("+", "%20");String publicUrl = String.format("%s/%s", "http://"+fileDomain, encodedFileName);long expireInSeconds = 3600;//1小時,可以自定義鏈接過期時間String finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds);return finalUrl;}}Controller?
package cn.edu.zstu.shihua.xihu.controller;import cn.edu.zstu.shihua.xihu.dto.ResponseBean; import cn.edu.zstu.shihua.xihu.entity.StatusCode; import cn.edu.zstu.shihua.xihu.provider.QiNiuProvider; import com.fasterxml.jackson.databind.ObjectMapper; import com.qiniu.storage.model.DefaultPutRet; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID;/*** FileName: QiniuController** @author ShenTuZhiGang* @version 1.0.0* @date 2020/7/29 21:27*/ @RestController @RequestMapping("/qiniu") @Slf4j public class QiNiuController {@Autowiredprivate QiNiuProvider qiNiuProvider;@Autowiredprivate ObjectMapper objectMapper;/*** 七牛云文件上傳** @param file 文件* @return*/@RequestMapping(value = "/upload",method = {RequestMethod.POST})//@ResponseBodypublic ResponseBean upload(MultipartFile[] file) {ResponseBean response = new ResponseBean(StatusCode.SC_INTERNAL_SERVER_ERROR);if (file.length <= 0 || file[0].isEmpty()) {return new ResponseBean(StatusCode.SC_EXPECTATION_FAILED,"上傳文件不能為空");}try {FileInputStream fileInputStream = (FileInputStream) file[0].getInputStream();String originalFilename = file[0].getOriginalFilename();String fileExtend = originalFilename.substring(originalFilename.lastIndexOf("."));String yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());//默認不指定key的情況下,以文件內容的hash值作為文件名String fileKey = UUID.randomUUID().toString().replace("-", "") + "-" + yyyyMMddHHmmss + fileExtend;Map<String, Object> map = new HashMap<>();DefaultPutRet uploadInfo = qiNiuProvider.upload(fileInputStream, fileKey);map.put("fileName", uploadInfo.key);map.put("originName", originalFilename);map.put("size", file[0].getSize());//七牛云文件私有下載地址(看自己七牛云公開還是私有配置)map.put("url", "http://cdn.shentuzhigang.top/" + uploadInfo.key); // map.put("url", "/linfen/qiniu/file/" + uploadInfo.key);//七牛云公開下載地址//String json = objectMapper.writeValueAsString(map);response.setStatus(0);response.setMsg("成功");response.setData(map);log.info("文件:" + map);return response;} catch (Exception e) {e.printStackTrace();return response;}}/*** 七牛云私有文件下載** @param filename 文件名* @return*/@RequestMapping(value = "/private/file/{filename}",method = {RequestMethod.GET})public void privateDownload(@PathVariable("filename") String filename, HttpServletResponse response) {if (filename.isEmpty()) {return;}try {String privateFile = qiNiuProvider.getPrivateFile(filename);log.info("文件下載地址:" + privateFile);response.sendRedirect(privateFile);} catch (Exception e) {e.printStackTrace();}}/*** 七牛云文件下載** @param filename 文件名* @return*/@RequestMapping(value = "/file/{filename}",method = {RequestMethod.GET})public void download(@PathVariable("filename") String filename, HttpServletResponse response) {if (filename.isEmpty()) {return;}try {String privateFile = qiNiuProvider.getFile(filename);System.out.println("文件下載地址:" + privateFile);response.sendRedirect("http://"+privateFile);} catch (Exception e) {e.printStackTrace();}} }參考文章
springmvc整合七牛云存儲實現文件上傳(java篇)
springboot項目集成七牛云OSS對象存儲, 實現文件上傳
七牛云java(服務端)通用工具類
Java中定義常量的幾種方法
Postman Post請求上傳文件
JAVA——實現七牛云對象存儲Region對象采用配置方式生成解決方案
總結
以上是生活随笔為你收集整理的Spring Boot——集成七牛云OSS对象存储SDK解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA——实现七牛云对象存储Regio
- 下一篇: Spring Boot——LocalDa