整個過程簡單分為四步:

1.註冊七牛賬號,獲取公鑰私鑰(access_key/secret_key);

2.設置存儲空間bucket,並獲取域名domain ;

3.通過公鑰私鑰和存儲空間獲取上傳憑證token;

4.根據上傳憑證上傳文件到七牛並獲取key值,通過key值、domain組合,可以獲取圖片外鏈;


1.七牛官網:https://portal.qiniu.com/,,註冊個賬號就好了(樓主這裏隨便註冊了個個人賬號)

java七牛上傳加文件生成日期文件夾_java七牛上傳加文件生成日期文件夾


註冊成功後,去到個人面板——>密鑰管理,就能看到自己賬號的公鑰私鑰了,點擊左邊欄的“對象存儲”就可以去設置存儲空間了;

java七牛上傳加文件生成日期文件夾_#圖片_02


2.設置存儲空間bucket,並獲取域名domain ;

java七牛上傳加文件生成日期文件夾_#七牛_03

這裏的存儲區域和後面的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>

設置好之後就是這個樣子:

java七牛上傳加文件生成日期文件夾_java七牛上傳加文件生成日期文件夾_04

因為融合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對象實例獲取):

java七牛上傳加文件生成日期文件夾_#七牛_05

上傳成功之後可以去七牛雲的個人面板——>對象存儲,去到對應的存儲空間的內容管理模塊,就能看到自己上傳的文件了;

可以發現上傳多個重複的文件的時候,上面是不會覆蓋的;

java七牛上傳加文件生成日期文件夾_java七牛上傳加文件生成日期文件夾_06

可以直接獲取文件外鏈,也可以自己拼裝外鏈,這裏的拼裝規則很簡單,就是:外鏈默認域名+"/"+key