七牛云对象存储服务提供高可靠、强安全、低成本、可扩展的非结构化数据的存储服务。
它提供简单的 Web 服务接口,可以通过七牛开发者平台或客户端存储和检索任意数量的数据,支持 “按使用付费” 模式,可以通过调用REST API 接口和 SDK开发工具包访问,下载协议采用HTTP 和 HTTPS 协议。方便程序员聚焦业务应用,而无需关注底层存储实现技术。
七牛云提供了两种存储,标准存储和低频存储,我选用的是标准存储,低延迟高吞吐的性能。低频存储主要是应对访问较低但速度较快的情况。
七牛云属于第三方SDK,服务器和七牛云理论上只有上传和下载的交互,为了保证安全,访问密钥是必要的。
安全机制方面,七牛针对性的提供了三种安全机制:上传凭证、下载凭证和管理凭证。密钥(AccessKey/SecretKey)用于以上几种凭证的生成。理论叙述方面参考官方文档:【https://developer.qiniu.com/kodo/manual/1644/security】,使用方面,只需要调用七牛云给出的uploadToken(bucketname) 这样的接口就可以,不必理解也可以轻松实现。
(1)申请七牛云账号。 新用户享有10GB永久免费存储空间、每月 10GB 下载流量、每月 10万次PUT请求、每月 100万 次GET请求、每月 750 小时自定义数据处理MOC1实例免费使用时间和每月MPS配额20元。
(2)创建空间 Bucket
(3)上传文件:这里可以先在自己空间的内容管理页面上上传一部分图片;也可以参考开发者文档直接在程序里尝试上传图片。
项目需要,我需要把用户上传的本地图片存储到七牛云空间。
新建一个QiniuService,可以参考开发者文档中有关简单上传的Demo,完成一次上传。
但是我的代码有所不同,我没有图片的网络路径,不能使用Demo里面的Response response = uploadManager.put(localFilePath, key, upToken);
因为图片名字是我要用UUID随机生成的,所以我的代码如下:
@Service
public class QiniuService {
private static final Loggerlogger = LoggerFactory.getLogger(QiniuService.class);
//设置好账号的ACCESS_KEY和SECRET_KEY
String ACCESS_KEY= "3upxa8kaIXYrG****************";
String SECRET_KEY= "9p-Ol6MqKIhIS********************";
//要上传的空间
String bucketname= "fastnews";
//密钥配置
Auth auth= Auth.create(ACCESS_KEY,SECRET_KEY);
//创建上传对象
Configuration cfg= new Configuration(Zone.zone1());
UploadManager uploadManager= new UploadManager(cfg);
private static String QINIU_IMAGE_DOMAIN= "http://ot***fn53.***.cloud**.com/";
//简单上传,使用默认策略,只需要设置上传的空间名就可以了
public StringgetUpToken() {
return auth.uploadToken(bucketname);
}
public StringsaveImage(MultipartFile file)throws IOException {
try {
String fileName = UUID.randomUUID().toString().replaceAll("-","") + "." +fileExt;
//调用put方法上传
Response res = uploadManager.put(file.getBytes(),fileName, getUpToken());
//打印返回的信息
if (res.isOK() && res.isJson()) {
return QINIU_IMAGE_DOMAIN+ JSONObject.parseObject(res.bodyString()).get("key");
} else{
logger.error("七牛异常1:"+ res.bodyString());
return null;
}
} catch (QiniuException e) {
// 请求失败时打印的异常的信息
Response r=e.response;
System.out.println(r.toString());
logger.error("七牛异常2:"+ e.getMessage());
return null;
}
}
}
这里有个小Bug,最开始在Maven里面用的七牛的JDK不是最新的,因此遇到了一个Bug:
{ResponseInfo:com.qiniu.http.Response@7717898,status:400,reqId:TjUAABPXnYCFqdUU, xlog:body;UP:1/400, xvia:,adress:up.qiniu.com/122.224.95.105:80, duration:0.000000 s, error:incorrectregion, please use up-z1.qiniu.com}
因为我当时选的是华北用户,默认是华南用户,用的是zone0,而我应该用zone1.所以我回去查看了一下SDK的源码:
应该修改Config参数,让我的默认空间是Zone1.
然后搞笑的事情来了,IDEA对这个read-only的文件,简直了,官网上给的修改只读方式根本点不动啊!!分分钟想掀桌。
OK,我又在http://mvnrepository.com 里找了新版,新版里面没有这个config,取代的是需要在代码里面用
Configuration cfg = new Configuration(Zone.zone1());
UploadManager uploadManager = newUploadManager(cfg);
来指定自己的区域。
上传下载图片搞定之后,发现因为前端代码的限制,图片过大,无法完全展示的问题。
七牛云提供了一些图片的处理:
https://developer.qiniu.com/dora/manual/1279/basic-processing-images-imageview2
imageView2提供简单快捷的图片格式转换、缩略、剪裁功能。只需要填写几个参数,即可对图片进行缩略操作,生成各种缩略图。参考名称和说明可以自己设置自己要的处理方式。
不过直观而言,我选择了界面操作生成的方式。具体而言,打开控制台的图片处理,选择想要的缩减方式和是否添加水印,设置水印的样子颜色等,然后就会生成这样的
imageView2/1/w/50/h/50/q/75|watermark/2/text/RmFzdE5ld3M=/font/5a6L5L2T/fontsize/160/fill/IzAwMDAwMA==/dissolve/100/gravity/SouthEast/dx/8/dy/8|imageslim
处理接口代码,我将这部分代码放入自己的工程,重启再运行就可以在页面里看到自己加过水印,裁剪过的图片了。
这几天研究七牛云,觉得非常有意思。还有几个点,以后有时间想要实现一下。
(1)异步处理图片:对已经上传到七牛的图片发起异步缩图的操作。我选择的是下载图片的时候进行实时的缩图,但是如果能够上传之后就进行缩图,会更一步的节省空间吧。
(2)预转持久化:既保存原图也保存缩略图。
(3)图片瘦身:图片瘦身服务(imageslim)在不影响画质的情况下,将JPEG、PNG格式的图片实时压缩,大幅缩小文件体积。这是七牛云提供的有偿服务,对于有加速域名的用户,该域名下全部 jpg 和 png 将会自动瘦身,收费是0.1元/千次。
(4)CDN加速:CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。