整个过程简单分为四步:
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