一、前言
本文將基於springboot2.1.8.RELEASE
整合七牛雲
實現文件上傳
本文參考 https://www.keppel.fun/articles/2019/02/27/1551262881214.html
二、準備(AccessKey
、SecretKey
、對象儲存空間名稱
、存儲區域
、訪問域名
)
1、先到七牛雲官網獲取AccessKey/SecretKey
溫馨小提示:沒有賬號的可以先註冊一個使用~
2、在對象儲存中創建一個空間,然後拿到存儲空間名稱
、存儲區域
、訪問域名
溫馨小提示:這裏只是爲了體驗七牛雲的文件上傳功能,在訪問控制處可暫時選擇公開,後面是可以修改權限的,不用擔心~
新建成功之後,七牛雲給了一個測試域名可供使用一個月
三、SpringBoot集成七牛雲
1、pom.xml
中引入依賴
<!-- https://mvnrepository.com/artifact/com.qiniu/qiniu-java-sdk -->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.2.28</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
2、application.yml
中配置七牛雲
# ========================== ↓↓↓↓↓↓ 七牛雲配置 ↓↓↓↓↓↓ ==========================
qiniu:
accessKey: xxx
secretKey: xxx
# 對象儲存
bucket: zhengqingya # 空間名稱
zone: huadong # 存儲區域
domain: q6nf5vyrf.bkt.clouddn.com # 訪問域名
3、七牛雲配置類
@Configuration
public class QiniuConfig {
@Value("${qiniu.accessKey}")
private String accessKey;
@Value("${qiniu.secretKey}")
private String secretKey;
@Value("${qiniu.zone}")
private String zone;
/**
* 配置空間的存儲區域
*/
@Bean
public com.qiniu.storage.Configuration qiNiuConfig() {
switch (zone) {
case "huadong":
return new com.qiniu.storage.Configuration(Zone.huadong());
case "huabei":
return new com.qiniu.storage.Configuration(Zone.huabei());
case "huanan":
return new com.qiniu.storage.Configuration(Zone.huanan());
case "beimei":
return new com.qiniu.storage.Configuration(Zone.beimei());
default:
throw new MyException("存儲區域配置錯誤");
}
}
/**
* 構建一個七牛上傳工具實例
*/
@Bean
public UploadManager uploadManager() {
return new UploadManager(qiNiuConfig());
}
/**
* 認證信息實例
*/
@Bean
public Auth auth() {
return Auth.create(accessKey, secretKey);
}
/**
* 構建七牛空間管理實例
*/
@Bean
public BucketManager bucketManager() {
return new BucketManager(auth(), qiNiuConfig());
}
@Bean
public Gson gson() {
return new Gson();
}
}
4、編寫文件上傳與刪除方法
服務類:
public interface IQiniuService {
/**
* 以文件的形式上傳
*
* @param file
* @param fileName:
* @return: java.lang.String
*/
String uploadFile(File file, String fileName) throws QiniuException;
/**
* 以流的形式上傳
*
* @param inputStream
* @param fileName:
* @return: java.lang.String
*/
String uploadFile(InputStream inputStream, String fileName) throws QiniuException;
/**
* 刪除文件
*
* @param key:
* @return: java.lang.String
*/
String delete(String key) throws QiniuException;
}
服務實現類:
@Service
public class QiniuServiceImpl implements IQiniuService, InitializingBean {
@Autowired
private UploadManager uploadManager;
@Autowired
private BucketManager bucketManager;
@Autowired
private Auth auth;
@Value("${qiniu.bucket}")
private String bucket;
@Value("${qiniu.domain}")
private String domain;
/**
* 定義七牛雲上傳的相關策略
*/
private StringMap putPolicy;
@Override
public String uploadFile(File file, String fileName) throws QiniuException {
Response response = this.uploadManager.put(file, fileName, getUploadToken());
int retry = 0;
while (response.needRetry() && retry < 3) {
response = this.uploadManager.put(file, fileName, getUploadToken());
retry++;
}
if (response.statusCode == 200) {
return "http://" + domain + "/" + fileName;
}
return "上傳失敗!";
}
@Override
public String uploadFile(InputStream inputStream, String fileName) throws QiniuException {
Response response = this.uploadManager.put(inputStream, fileName, getUploadToken(), null, null);
int retry = 0;
while (response.needRetry() && retry < 3) {
response = this.uploadManager.put(inputStream, fileName, getUploadToken(), null, null);
retry++;
}
if (response.statusCode == 200) {
return "http://" + domain + "/" + fileName;
}
return "上傳失敗!";
}
@Override
public String delete(String key) throws QiniuException {
Response response = bucketManager.delete(this.bucket, key);
int retry = 0;
while (response.needRetry() && retry++ < 3) {
response = bucketManager.delete(bucket, key);
}
return response.statusCode == 200 ? "刪除成功!" : "刪除失敗!";
}
@Override
public void afterPropertiesSet() throws Exception {
this.putPolicy = new StringMap();
putPolicy.put("returnBody", "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"width\":$(imageInfo.width), \"height\":${imageInfo.height}}");
}
/**
* 獲取上傳憑證
*/
private String getUploadToken() {
return this.auth.uploadToken(bucket, null, 3600, putPolicy);
}
}
四、測試文件上傳與刪除
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class QiniuTest {
@Autowired
private IQiniuService qiniuService;
@Test
public void testUpload() throws QiniuException {
String result = qiniuService.uploadFile(new File("D:\\IT_zhengqing\\image\\helloworld.jpg"), "helloworld");
System.out.println("訪問地址: " + result);
}
@Test
public void testDelete() throws QiniuException {
String result = qiniuService.delete("helloworld");
System.out.println(result);
}
}