现在正在开发的android程序需要存储一些文件,想要云存储空间,花了一天的时间,研究了一下2017年7月份的云存储的现状:
评价标准:有没有api接口,有没有增量功能。
1、公有云
Dropbox 被墙。支持文件增量上传,
Google Drive 被墙
Windows SkyDrive OneDrive SDK,需要windows的技术平台
box 收费,提供移动端SDK(https://github.com/box/box-android-sdk)
mega 被墙
腾讯微云 cos
百度网盘 内测android sdk,不提供ios sdk。百度已经关闭了pcs的申请。
金山快盘 快盘个人存储服务已经于2016年8月16日正式关闭。
360云
坚果云 增量功能。不提供api接口
阿里云 收费,oss(https://www.aliyun.com/product/oss/)安卓sdk(https://github.com/aliyun/aliyun-oss-java-sdk?spm=5176.doc32008.2.2.4hszEE)
七牛云 免费,提供android接口,社区友好。
2、私有云
seafile https://manual.seafile.com/,搭建自己的私有文件系统,只有web api。
owncloud ownCloud的移动客户端android版本不错。
私有云需要自己搭建主机和存储环境。暂时不考虑。最后选择了七牛云,因为小容量免费,社区支持好,网上的资料很多。
接着搭建demo环境。
1、在七牛云注册用户,并在对象存储中新建存储空间,填写“存储空间名称”gpxspace,“存储区域”华南,“访问控制”公共空间。随后自动生成测试域名some.bkt.clouddn.com,云存储的配置工作完成。还可以申请一个私有空间,同样记住空间名称和生成的测试域名。
2、在七牛云个人中心 中的密钥管理,找到AccessKey/SecretKey。
3、阅读七牛云的开发文档,https://developer.qiniu.com/kodo,特别是编程模型,安全机制,还要android SDK这几个部分。简单的说,在七牛云中上传文件和下载文件,都需要TOKEN令牌,这个TOKEN的生成不是在七牛云的服务器上,也不在android的客户端,而是需要开发人员自己的服务器上通过SDK生成。然后andorid向服务器请求TOKEN,得到TOKEN之后,再向七牛云发起文件的操作。
4、搭建demo所需要的服务器环境。demo在https://github.com/qiniudemo/qiniu-api-server/tree/master/php-v6
将代码部署到服务器上,我是部署在新浪云上,php版本V7,访问地址http://test.applinzi.com。
需要修改的内容是php-v6目录下的config.php文件
//七牛的AK,SK,从 https://portal.qiniu.com/user/key 获取
$Qiniu_AccessKey = "在第2步获得";
$Qiniu_SecretKey = " 在第2步获得";
//公开空间
$Qiniu_Public_Bucket = "在第1步获得的公共空间名";
//公开空间对应域名,测试阶段可以使用七牛给出的默认域名,生产阶段请使用自定义域名
$Qiniu_Public_Bucket_Domain = "在第1步获得的公共空间对应的测试域名";
//私有空间
$Qiniu_Private_Bucket = "在第1步获得的私有空间名";
//私有空间对应域名,测试阶段可以使用七牛给出的默认域名,生产阶段请使用自定义域名
$Qiniu_Private_Bucket_Domain = "在第1步获得的私有空间对应的测试域名";
$APP_CALLBACK_ROOT="就是第4步部署的服务器端访问地址,例子是http://test.applinzi.com";
保存。
5、配置android客户端。demo在https://github.com/qiniudemo/qiniu-lab-android
将代码下载到本地,然后用开发工具intellij或者AS打开QiniuLab下面的项目,修改com.qiniu.qiniulab.config.QiniuLabConfig.java文件
将REMOTE_SERVICE_SERVER修改为第4步中的服务器端地址,这里是http://test.applinzi.com
然后运行app,就可以测试七牛的demo。
6、问题总结。第5步中的android客户端代码可能比较老,在新的7.3.3版本的sdk中,需要config初始化uploadmanager。注意存储空间所在的zone。
//————http上传,指定zone的具体区域——
//Zone.zone0:华东
//Zone.zone1:华北
//Zone.zone2:华南
//Zone.zoneNa0:北美
//———http上传,自动识别上传区域——
//Zone.httpAutoZone
//———https上传,自动识别上传区域——
//Zone.httpsAutoZone
Configuration config = new Configuration.Builder()
.chunkSize(256 * 1024) //分片上传时,每片的大小。 默认256K
.putThreshhold(512 * 1024) // 启用分片上传阀值。默认512K
.connectTimeout(10) // 链接超时。默认10秒
.responseTimeout(60) // 服务器响应超时。默认60秒
.recorder(null) // recorder分片上传时,已上传片记录器。默认null
.recorder(null, null) // keyGen 分片上传时,生成标识符,用于片记录器区分是那个文件的上传记录
.zone(Zone.zone2) // 设置区域,指定不同区域的上传域名、备用域名、备用IP。
.build();
this.uploadManager = new UploadManager(config);