《武汉工程大学学报》  2017年01期 78-82   出版日期:2017-03-29   ISSN:1674-2869   CN:42-1779/TQ
基于REST服务的电子相册的实现


相册是用来记录人们生活中种种美好的瞬间[1],它本身具有存储和共享功能[2]. 随着新技术的发展和人们生活习惯的改变,“相册”开始以另外一种角色出现在人们的生活中. 20世纪50年代开始,人类走向了信息时代[3]. 信息时代为人类传播、存储、共享信息提供了新方法[4],人类的视角开始由现实转向为虚拟[5]. 与此同时,相册也开始了由纸质版向电子档的转变. 由于Internet存储共享信息的不同,电子相册也具有了新特性——更大的存储量[6],只要有电子档就可永久保存,共享信息的瞬时性,无视时间和空间限制[7]等等. REST是可以视为一组软件架构约束、原则或规范[8],尚且处于概念阶段. 满足这些约束条件和原则的应用程序或设计就是 RESTful. 由于REST是基于URI和HTTP等协议标准,因此称为对早期Internet协议的回归. 所以将REST应用到Web服务中,构成了REST风格的API,形成了一种新的服务调用方法. 通过这种方式可以降低开发的复杂性,同时提高系统的可伸缩性. 本文基于REST服务设计并实现了电子相册的管理. 系统使用REST服务实现了照片的上传、下载等各种操作,并把这些服务进行了组合,提高了系统的可维护性. 系统使用的是阿里OSS(Object Storage Service,对象存储)提供的REST服务[9]平台. 1 REST服务的主要操作阿里OSS提供的REST API主要实现的操作有:关于服务(Service)操作;关于容器(Bucket)的操作;关于对象(Object)的操作;关于分片上传(Multipart Upload)的操作;跨域资源共享(CORS);关于音、视频上传(Live Channel)的操作;OSS错误回应. 在电子相册中主要用到前4种操作,下面是上述4种操作的主要信息. 1)关于服务的操作关于Service的操作只有一种方法GetService(listBucket),该方法的功能是获取请求者所创建的所有Bucket. 对应在电子相册系统中,该功能的作用是获取到所有创建成功的相册. 2)关于容器的操作对Bucket的操作主要集中在创建Bucket,设置Bucket相关信息,获取Bucket和Bucket相关信息,以及删除Bucket和Bucket相关信息四个方面. Bucket在OSS中起到一个容器的作用,用于放置Object. 对应在电子相册系统中,对Bucket的操作就是对相册的操作. 因为在OSS提供REST服务中Bucket相对Object来说,起着容器的作用;而相册相对于相片,从逻辑上讲也是一个容器的作用. 因此对Bucket的操作就是对相册的操作. 3)关于对象的操作对Object的操作是OSS开发中的核心部分,也是对OSS应用的根源所在. Object可以是任意类型的文件,并且由于OSS提供的服务是基于HTTP的RESTful API,所以在联网的情况下,用户可以在任何应用、任何时间、任何地点对Object进行处理. 因此对Object的操作主要集中在对文件的操作:上传文件,对文件的相关操作,下载文件,删除文件,以及获取文件的相关信息等. 通过2)中描述可知,对Object的操作就是对相片的操作. 4)关于分片上传的操作Multipart Upload操作是对PUT Object(上传文件)操作的补充. 它在满足上传文件基础上,还支持断点上传,超过100 MB文件的上传,网络服务差或者OSS服务器之间连接经常断开的上传,以及上传未知大小文件. 根据该模式上传文件特点,首先使用先导功能Initiate Multipart Upload来创建一个全局唯一的 Upload ID,以确保接下来的Multipart Upload操作. 接下来的操作有:分块上传;将所有的数据块合并为一个完整的Object;终止Multipart Upload操作;列出所有正在上传的Multipart Upload操作;列出所有上传完的块. 因此对Multipart Upload的操作就是对相片操作的补充. 阿里云通过RESTful API[10]的形式对外提供服务,并提供了RESTful操作和相关示例,以及与开发人员相关的开发指南和相关主流编程语言的SDK工具包. 在阿里云中有两个重要的概念:Object(对象)和Bucket(阿里OSS提供的云存储空间). 第一,阿里云OSS的实现过程是将数据文件以Object的形式与Bucket进行交互;第二,OSS上一个账户可以创建一个或多个Bucket,但最多不能超过10个;第三,每个Bucket中可以创建一个或者多个Object. 2 系统功能模块在电子相册的设计与实现过程中有两个核心模块[11]:相册管理模块和相片管理模块. 下面就对这两个功能模块进行具体的描述. 2.1 相册管理模块相册模块在功能上和普通电子相册类似,都具有以下4种功能:“创建相册”,“设置相册”,“获取相册”,“删除相册”. 在此过程的设计中,为保证相册的唯一性以及后期对相册具体操作的可行性,相册名必须唯一. 因此对相册的相关操作就会出现各种判断情况. 在“创建相册”过程中如果相册已存在,在编程实现中就是相册名已存在,那么就需要重命名后再创建相册,以保证相册名的唯一;“设置相册”功能是一个直接功能,因此可以直接对相册进行设置;同时“获取相册”也是一个直接功能,该功能可以获得“设置相册”功能中对相册相关设置信息,也可以获得该相册中所有相片列表;最后“删除相册”功能,它的实现过程和所有软件的删除过程一样,都需要一个确定操作,来确认相册是否被删除,这个过程中删除操作的对象是相册的相册名以及该相册名下的所有相片. 由于在电子相册的设计过程中对相册管理模块的设计,就是在电子相册开发过程中对Bucket管理模块的设计、故相册管理模块的结构如图1所示. 2.2 相片管理模块相片管理模块的结构如图2所示. 相片管理模块在功能上和普通电子相册同样类似,但是由于它的存放空间是由第三方提供的云[12],因此在应用时就有天差地别的效果. 传统的电子相册是保存在计算机本地内存[13],那么用户想要查看,就只能通过计算机本身;而存储到云端的相册则可以在联网的情况下,通过网络直接获取到相片. 因此可以满足用户随时随地上传和下载相片的要求[14]. 在此基础上对相片管理模块[15]进行设计,相片管理模块具有以下五种功能:“上传相片”,“设置相片”,“下载相片”,“操作相片”,“删除相片”. 在此过程的设计中,为保证对相片操作的唯一性以及后期对相片具体操作的可行性,同一相册下相片名必须唯一,不同相册之间的相片名可以重复. 因此对相片的相关操作就会出现各种判断情况. 在“上传相片”过程中如果该相册中的相片已存在,在编程实现中就是相片名已存在,那么就需要对相片进行重命名,以保证该相片名唯一,该功能是将本地的相片上传到云端;“设置相片”功能是一个直接功能,可以通过阿里OSS提供REST API直接对相片的相关信息进行设置;“下载相片”功能,是直接把云端的相片下载到本地;“操作相册”中也是一个直接功能,该功能可以由述方法获得 “设置相册”功能中对相片的相关设置信息,同时也可以对相片进行获取、拷贝等操作;“删除相片”功能,它的实现过程和“删除相册”一样,需要确定是否删除相片,该过程是删除选中的相片. 由于在电子相册的设计过程中对相片管理模块的设计,就是在电子相册开发过程中对Object管理模块的设计. 3 主要功能实现电子相册的主要功能按照其主要功能模块的设计思路来实现的. 因此就有相册管理相关功能的实现和相片管理相关功能的实现. 下面就这两大功能实现的主要操作进行描述. 3.1 相册管理相关功能实现3.1.1 创建相册 首先设计出了创建相册的命名的格式,通过将“shylot-”和页面上用户输入的相册名相结合,实现最终OSS中相册命名“shylot-用户输入相册名”这一格式,然后调用OSS提供的REST API的方法createBucket(bucketName),最终实现创建出一个Bucket,即“创建相册”的功能. 而这个“相册”最终就是会在OSS云存储中以Bucket的方式出现. 3.1.2 查看相册 根据获取相片所属的Bucket名称和该相片的名称,通过调用REST API的getObject()方法,就可以获取保存在阿里云中的该Bucket下对应的照片的信息,最后通过流输出的方法,将该照片显示出来,从而达到在云相册系统中,查看保存在云中的照片的方法. 3.1.3 删除相册 删除相册的实现,是在通过函数的映射,以及REST API提供的开发方法,使得开发者能够很好实现该功能. 同样使用通过OSS提供的REST API方法中的deleteBucket()方法,以实现相册的删除. 最终实现的结果在云相册中就存在已经被删除的相册,而对应在OSS云存储中相应的Bucket就会被删除掉. 3.2 相片管理相关功能实现3.2.1 上传相片 将Java编程技术与OSS提供的REST API的putObject()结合起来使用,最终实现上传相片目的. 上传一个照片需要定义bucketName为上传相片所属的相册名,key为上传的相片名,content为上传文件的大小设置,meta为上传文件的信息描述,这四者结合起来就可以实现一个相片上传的后台设置. 最终在OSS云存储中该相册(Bucket)名下就会出现对应的相片(Object)名. 3.2.2 查看相片 通过获取相片对应的bucketName相册名,然后获取该相片名key,接着调用OSS提供的REST API的getObject(bucketName, key)方法,就可获得保存在阿里云中的该相片的信息,然后将该信息以流的方式输出,Java编程的JPEGCodec.createJPEGEncoder()的方法创建一个和指定输出流关联的JPEGImageEncoder对象,最后将该对象显示出来就完成了具体相片的查看功能. 3.2.3 删除相片 获得删除相片所对应的相册名bucketname,然后就是该相片的名称key,最后调用OSS提供的REST API风格的删除Object方法deleteObject(bucketName, key),最终实现将相片从阿里云中删除. 同样的在OSS云存储中对应相册中的相片就会被删除掉. 4 安全性与比较REST风格的Web服务的核心是资源.所有REST服务利用HTTP的统一接口,以及4种基本操作方法GET、PUT、DELETE和POST,保障了资源的安全性.同时通过阿里云这一第三方云平台,保证了数据的安全可用.文献[4]使用OpenCV视觉库来实现相片的半自动化分类,文献[11]使用SSH框架来优化相册的架构,文献[15]通过改进相片的相关技术来实现相片的准确提取和自适应划分;这3种相册都是从技术上对相册进行优化. 本系统相对于这3种技术而言,具有结构和操作简单、可扩展性好的优势.通过采用REST API技术从底层构建相册系统,并结合API本身的特性,从而使相册系统的结构和操作更加简单;由于系统的功能是以REST服务的形式实现,通过Web服务组合方法,可以更方便地实现系统功能扩充.5 结 语以上介绍了基于REST服务的电子相册系统的实现方法. 通过使用阿里OSS提供的REST服务API,实现了在云端传递和下载图片的功能,满足用户能够随时随地下载图片的需求,同时又保证了图片的永久存储. 由REST服务和云存储技术结合起来的开发技术,为信息的分享和存储提供新的思路. 以本文实现的电子相册为基础,在REST服务组合方法等方面将进行进一步的研究.