Java上传图片到七牛服务器简单教程

整个过程简单分为四步:

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









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值