前言 本篇文章主要是具体介绍OBS在android中的应用,关于OBS的概念的话我就简单介绍一下哈,不过也不用担心,我会将OBS的官网链接放到文章里,有需要的可以点进去详细了解一下哈。。。。
首先简单介绍一下OBS是什么,Object Storage Service简称OBS——对象存储服务。官网详细介绍如下:
对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力。OBS系统和单个桶都没有总数据容量和对象/文件数量的限制,为用户提供了超大存储容量的能力,适合存放任意类型的文件,适合普通用户、网站、企业和开发者使用。OBS是一项面向Internet访问的服务,提供了基于HTTP/HTTPS协议的Web服务接口,用户可以随时随地连接到Internet的电脑上,通过OBS管理控制台或各种OBS工具访问和管理存储在OBS中的数据。此外,OBS支持SDK和OBS API接口,可使用户方便管理自己存储在OBS上的数据,以及开发多种类型的上层业务应用。华为云在全球多区域部署了OBS基础设施,具备高度的可扩展性和可靠性,用户可根据自身需要指定区域使用OBS,由此获得更快的访问速度和实惠的服务价格。
简单的来说就是以往的开发逻辑是将获取到的文件上传到服务端上,但是现在我们可以将这些获取到的文件保存到OBS上,并且OBS还提供管理服务,让用户通过文件管理工具(OBS Browser+的下载)去自行处理管理文件,而不是用代码去增删改查,属实方便很多,哈哈哈。。。(当然OBS也支持开发者去用OBS SDK或者API接口去管理上传到OBS上的文件)同时对象存储服务的基本构成是桶和对象,对象就是我们上传上去的文件资源,而桶就是存储对象的容器,其实就是文件夹;好啦,基本概念就介绍到这,下面来通过公司项目来实战一下吧: 先来说一下,公司项目的开发要求,将用户选中的图片资源批量上传到OBS上就可以了。好的,现在来一步一步按照官网的步骤来,(前提在电脑上下载好了OBS Browser+,同时有公司的公钥和私钥去登录到公司的域里)如下图所示: 前提 好啦,开始进入官网学习吧,点击侧边栏的”SDK参考——>选择Android——>快速入门“ 如图: 之后就开始按照官网提示去安装SDK,如图: 这里说明一下就是我为什么直接开始安装SDK是因为android的开发环境我已经安装好了哈,所以如果没有安装好android的开发环境的同学可以先从“开发环境准备”这里操作哈,对了,还有一个非常重要的事情就是这个obs的文件服务他不是免费的,是需要付费的,如果同学您是企业开发人员的话,可以找公司报销,如果童鞋还是在校生,也可以尝试一下,从“OBS服务环境搭建”这里开始去阅读哈,目前我还没找到免费的途径,很抱歉。 好的,准备工作做好了之后,接下来就是用代码去实现上传文件资源到云端了(是的,其实OBS背后的技术就是云计算,他相当于百度云一样,是一个云端存储器)因为官网介绍的很详细,所以我就不一一的叙述每段代码了,我来跟进公司项目来具体讲解一下代码的实现:
//获取图片路径 响应startActivityForResult多图选择器的响应数据
@SuppressLint("LongLogTag")
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==REQUEST_CODE){
if (resultCode==RESULT_OK){
//得到图片路径的集合
ArrayList<String> list=data.getStringArrayListExtra(SelectorSettings.SELECTOR_RESULTS);
//显示到网格布局上去
loadAdapter(list);
Log.i("jjjj", "list: "+ list.toString());
gvPic.setVisibility(View.VISIBLE);
gvPic.setNumColumns(list.size());
//将图片路径转换成file格式
for (String s:list){
File f=new File(s);
files.add(f);
}
//重开一个线程
new Thread(new Runnable() {
@Override
public void run() {
for (String s:list){
//获取文件名称,带后缀名的
fileName=getFileName(s);
filesNameList.add(fileName);
//上传到OBS
uploadAndGetPicUrl(filesNameList,files);
}
}
}).start();
}
}
}
@SuppressLint("LongLogTag")
private void uploadAndGetPicUrl(List<String> fileNames,List<File> fs) {
/*用公司的终端节点,因为将文件资源上传到OBS上之后就将文件变成了一个网络资源,所以需要获取到这个网络资源的所在的网址,OBS上有文件资源的文件路径,后面给他拼接到一起就可以了*/
String endPoint = "https://endPoint";
String ak = "公司的公钥";
String sk = "公司的私钥";
// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);
//在上传文件之前在OBS上创建保存文件的文件夹feedback_pic
final String keySuffixWithSlash = "test/feedback_pic/";
obsClient.putObject("公司的桶名称", keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
// 初始化线程池
ExecutorService executorService = Executors.newFixedThreadPool(20);
// 执行并发上传
for (File f:fs){
executorService.execute(() -> {
if (f.isDirectory()){
// 如果是空文件夹,则在桶内创建对应的空文件夹对象
for (String name:fileNames){
if (f.getPath().contains(name)){
String remoteObjectKey = keySuffixWithSlash + fileNames + "/";
obsClient.putObject("公司的桶名称", remoteObjectKey, new ByteArrayInputStream(new byte[0]));
}
}
}else{
//清空一下数据集合
urlList.clear();
//批量上传文件资源
for (String name:fileNames){
if (f.getPath().contains(name)){
//拼接上传的文件路径
String remoteObjectKey = keySuffixWithSlash + name;
//将从图片选择器上获取到的文件路径以file的类型上传,并且上传到拼接好的目录上去
obsClient.putObject("公司的桶名称", remoteObjectKey, new File(f.getPath()));
//添加这个文件目录字符串,便于发送给后台
urlList.add(remoteObjectKey);
}
}
}
});
}
// 等待上传完成
executorService.shutdown();
while (!executorService.isTerminated())
{
try
{
executorService.awaitTermination(5, TimeUnit.SECONDS);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
// 关闭obsClient
try {
obsClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//根据传入的文件路径截取下图片名称带后缀名的
public String getFileName(String pathandname){
int start=pathandname.lastIndexOf( "/" );
int end=pathandname.lastIndexOf( "." );
if (start!=- 1 && end!=- 1 ) {
//如果return pathandname.substring(start+ 1,end+1 );就是不带后缀名的文件名称
return pathandname.substring(start+ 1 );
} else {
return null ;
}
}
好啦,以上就是将用户选中的图片批量上传到OBS上的全部知识点,之所以使用OBS对象存储服务是因为如果将用户选中的图片、视频之类的文件上传到服务端,那么我们知道这些图片和视频文件需要消耗的内存是非常大的,那么有的用户要上传那么多图片资源到服务端,这对于服务端来说非常不利的,所以我们可以把这些资源上传到第三方平台,更何况OBS是基于云计算技术支持的,所以OBS的还有最大的好处就是他可以实现自动扩容的功能,这样就不怕服务端会崩了。。。。上传成功后可以在OBS的管理工具上查看的,顺着自己拼接好的路径一个个的点开就行了,如图:
同时还支持对上传后的文件删除,编辑等功能,总之就是很方便。。。
|