整個過程簡單分為四步:
1.註冊七牛賬號,獲取公鑰私鑰(access_key/secret_key);
2.設置存儲空間bucket,並獲取域名domain ;
3.通過公鑰私鑰和存儲空間獲取上傳憑證token;
4.根據上傳憑證上傳文件到七牛並獲取key值,通過key值、domain組合,可以獲取圖片外鏈;
1.七牛官網:https://portal.qiniu.com/,,註冊個賬號就好了(樓主這裏隨便註冊了個個人賬號)
註冊成功後,去到個人面板——>密鑰管理,就能看到自己賬號的公鑰私鑰了,點擊左邊欄的“對象存儲”就可以去設置存儲空間了;
2.設置存儲空間bucket,並獲取域名domain ;
這裏的存儲區域和後面的com.qiniu.common.Zone中的配置一一對應
// 華東
public static Zone zone0() {
return new FixedZone("http://up.qiniu.com", "http://upload.qiniu.com",
"", "http://rs.qbox.me", "http://rsf.qbox.me", "http://iovip.qbox.me",
"https://up.qbox.me", "http://api.qiniu.com");
}
// 華北
public static Zone zone1() {
return new FixedZone("http://up-z1.qiniu.com", "http://upload-z1.qiniu.com",
"", "http://rs-z1.qbox.me", "http://rsf-z1.qbox.me", "http://iovip-z1.qbox.me",
"https://up-z1.qbox.me", "http://api-z1.qiniu.com");
}
// 華南
public static Zone zone2() {
return new FixedZone("http://up-z2.qiniu.com", "http://upload-z2.qiniu.com",
"", "http://rs-z2.qbox.me", "http://rsf-z2.qbox.me", "http://iovip-z2.qbox.me",
"https://up-z2.qbox.me", "http://api-z2.qiniu.com");
}
// 北美
public static Zone zoneNa0() {
return new FixedZone("http://up-na0.qiniu.com", "http://upload-na0.qiniu.com",
"", "http://rs-na0.qbox.me", "http://rsf-na0.qbox.me", "http://iovip-na0.qbox.me",
"https://up-na0.qbox.me", "http://api-na0.qiniu.com");
}
這裏曾經遇到過坑,因為依賴的是較早版本的java-sdk(<version>[7.0.0, 7.2.99]</version>),,因為較早版本的只有zone0和zone1,結果導致上傳異常,解決辦法依賴最新版本的Jar就可以了;
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.2.0, 7.2.99]</version>
</dependency>
設置好之後就是這個樣子:
因為融合CDN加速域名需要收費,這裏又是隻做説明,所以只用測試域名就可以了;
前面的準備工作OK了,剩下的就更簡單了,其實七牛的官方文檔已經很詳細了:http://developer.qiniu.com/code/v7/sdk/java.html#io-put;
3.通過公鑰私鑰和存儲空間獲取上傳憑證token
獲取token主要是通過com.qiniu.util.Auth的uploadToken()方法實現,為了滿足各種不同的需求,七牛對這個方法進行了重載,樓主經常只用第一個就夠了;
/**
* scope = bucket
* 一般情況下可通過此方法獲取token
*
* @param bucket 空間名
* @return 生成的上傳token
*/
public String uploadToken(String bucket) {
return uploadToken(bucket, null, 3600, null, true);
}
/**
* scope = bucket:key
* 同名文件覆蓋操作、只能上傳指定key的文件可以可通過此方法獲取token
*
* @param bucket 空間名
* @param key key,可為 null
* @return 生成的上傳token
*/
public String uploadToken(String bucket, String key) {
return uploadToken(bucket, key, 3600, null, true);
}
/**
* 生成上傳token
*
* @param bucket 空間名
* @param key key,可為 null
* @param expires 有效時長,單位秒
* @param policy 上傳策略的其它參數,如 new StringMap().put("endUser", "uid").putNotEmpty("returnBody", "")。
* scope通過 bucket、key間接設置,deadline 通過 expires 間接設置
* @return 生成的上傳token
*/
public String uploadToken(String bucket, String key, long expires, StringMap policy) {
return uploadToken(bucket, key, expires, policy, true);
}
/**
* 生成上傳token
*
* @param bucket 空間名
* @param key key,可為 null
* @param expires 有效時長,單位秒。默認3600s
* @param policy 上傳策略的其它參數,如 new StringMap().put("endUser", "uid").putNotEmpty("returnBody", "")。
* scope通過 bucket、key間接設置,deadline 通過 expires 間接設置
* @param strict 是否去除非限定的策略字段,默認true
* @return 生成的上傳token
*/
public String uploadToken(String bucket, String key, long expires, StringMap policy, boolean strict) {
long deadline = System.currentTimeMillis() / 1000 + expires;
return uploadTokenWithDeadline(bucket, key, deadline, policy, strict);
}
先根據公鑰私鑰生成com.qiniu.util.Auth對象,然後通過uploadToken()獲取上傳憑證token;
4.最後就是上傳文件了,以及獲取key,並組裝文件外鏈;
下面是自己簡單封裝的一個工具類,其實可以對upload()方法進行重載,以滿足不同的需求;
public class QiniuUtils {
public static final String QINIU_DOMAIN = "oi6buyfwl.bkt.clouddn.com";
public static final String BUCKET = "cqy-space0";
public static Auth auth = null;
static {
String access_key = "WaE8MA6D7pM8sF148gpiaM4tnen9GDfuFkoyvMu7";
String secret_key = "qMKE4NDOpd2eBQtvvLLSkEeOZJXqxlCh0p0NcsVW";
auth = Auth.create(access_key, secret_key);
}
/**
* @param file 待上傳的文件
* @param destFileName 七牛上顯示的文件名
* @param bucket 七牛上的存儲空間
*
* @return 七牛上顯示的文件名
*/
public static String upload(File file, String destFileName, String bucket) {
if (!file.exists()) {
throw new ServiceException("文件沒有找到");
}
bucket=StringUtil.isEmpty(bucket) ? BUCKET: bucket;
String token = auth.uploadToken(bucket);//獲取上傳憑證token
if (StringUtil.isEmpty(token)) {
throw new ServiceException("token獲取異常");
}
try {
Zone z = Zone.zone0();
Configuration c = new Configuration(z);
//創建上傳對象
UploadManager manger = new UploadManager(c);
Response res = manger.put(file, destFileName, token);//上傳文件並獲取回執
if (res.isOK()) {
Ret ret = res.jsonToObject(Ret.class);
System.err.println("----" + ret.key);
return ret.key;
}
} catch (QiniuException e) {
e.printStackTrace();
}
return null;
}
}
class Ret {
public long fsize;
public String key;
public String hash;
public int width;
public int height;
}
上傳斷點測試,獲取中間變量key(也就是七牛上顯示的文件名,這裏因為自己沒有設置,就需要通過Response對象實例獲取):
上傳成功之後可以去七牛雲的個人面板——>對象存儲,去到對應的存儲空間的內容管理模塊,就能看到自己上傳的文件了;
可以發現上傳多個重複的文件的時候,上面是不會覆蓋的;
可以直接獲取文件外鏈,也可以自己拼裝外鏈,這裏的拼裝規則很簡單,就是:外鏈默認域名+"/"+key