手机美图APP实践

场景概述

移动互联时代手机上传数据的场景随处可见,为了方便开发者聚焦于产品的业务逻辑,用户可以直接将文件存储到BOS上。BOS产品基于STS授权方式为用户提供了安全的上传和下载方式,BOS还支持图片处理服务。BOS具有成本低、支持海量存储和弹性扩展的特性,能帮助开发者更方便实现移动APP业务的开发。

本教程能帮助用户快速搭建一个基于BOS的文件直传+图片处理的手机APP,主要基于STS临时授权、Android SDK和图片处理API三个模块实现。

  • 由于用户的移动端应用存在泄密的风险所以不可能直接存储AK/SK信息,必须使用STS临时授权模式访问BOS。STS临时授权模式中会生成一个临时Token,该Token具有一定的时效性,即APP应用只有在Token的时效性内访问才可以完成上传或下载图片服务,过了时效需要重新获取。
  • Andriod SDK帮助用户实现新建BOS客户端并将文件存储到BOS或从BOS中下载文件。
  • 图片处理API主要实现图片的处理如缩略、裁剪、格式转换、旋转、加文字/图片水印等功能。

手机美图APP数据交互如下:

image.png

美图APP示例

手机美图示例APP下载地址:

下载完APP并安装完成后可以直接通过应用服务器地址访问BOS,并进行图片处理。应用服务器地址是指搭建移动应用的后台服务器,默认开启的端口为8080。关于BOS的区域和Bucket设置都需要在应用服务器进行配置。

APP操作方法

该APP支持用户上传、下载和下载缩放图三个功能。

  • 上传:用户填写应用服务器地址后,选择本地需要上传的图片,图片会显示在操作界面下方,点击上传即可。上传成功会显示“File Uploaded”。
  • 下载:用户填写需要下载的文件名称,点击下载按钮即可。下载成功会显示“File Downloaded”。
  • 下载缩放图:下载缩放图时必须指定明确的图片后缀如jpg,然后设置下载图形的宽和高以及旋转角度,点击下载缩放图,则会获取经过处理的图形。下载成功会显示“File Downloaded”。Demo版本下载后的图片都不会存储到本地。

如何搭建美图APP

搭建美图APP包含以下几个步骤:

  1. 开启BOS服务并创建Bucket用于存储图片,开通和创建Bucket的详细操作请参见创建Bucket。如果要下载缩放图,需要保证指定的Bucket开启了图片处理服务。
  2. 开通STS服务,用于保证上传和下载图片的安全性。
  3. 部署应用服务器,实现和BOS及客户端的交互,美图APP代码请参考:BOS美图APP代码
  4. 下载安装美图APP。

如何部署应用服务器

  1. 从github上下载sample code的代码包,代码包主要包含“bos_meitu_app”和“bos_meitu_app_server”两部分,其中“bos_meitu_app”主要用于定义APP界面及相关动作,“bos_meitu_app_server”为应用服务器相关配置。
  2. 修改“bos_meitu_app_server”中的“MeituAppServerHandler.java”文件,其中定义了ak/sk、BOS服务器对应的Endpoint和Bucket名称等信息。

    public String getBosInfo(String bosRequestType) {
        //配置ak、sk
        String bosAk = "开发者的ak";
        String bosSk = "开发者的SK";
        //百度智能云提供的stsendpoint
        String stsEndpoint = "http://sts.bj.baidubce.com";
    
        BceCredentials credentials = new DefaultBceCredentials(bosAk, bosSk);
        BceClientConfiguration clientConfig = new BceClientConfiguration();
        clientConfig.setCredentials(credentials);
        clientConfig.setEndpoint(stsEndpoint);
        StsClient stsClient = new StsClient(clientConfig);
        GetSessionTokenRequest stsReq = new GetSessionTokenRequest();
        // request expiration time
        stsReq.setDurationSeconds(1800);
        GetSessionTokenResponse stsToken = stsClient.getSessionToken(stsReq);
        String stsTokenAk = stsToken.getCredentials().getAccessKeyId();
        String stsTokenSk = stsToken.getCredentials().getSecretAccessKey();
        String stsTokenSessionToken = stsToken.getCredentials().getSessionToken();
    
        // BOS服务的Endpoint地址,及Bucket名称。
        String bosEndpoint = "http://bj.bcebos.com";
        String bucketName = "Bucket名称";
        if (bosRequestType.equalsIgnoreCase("download-processed")) {
            // the binded image processing domain set by App developer on bce console
            bosEndpoint = "http://" + bucketName + ".bj.bcebos.com";
        }
    
        // prefix is the bucket name, and does not specify the object name
        BosInfo bosInfo = new BosInfo(stsTokenAk, stsTokenSk, stsTokenSessionToken, bosEndpoint,
                bucketName, "", bucketName);
    
        String res = "";
        ObjectMapper mapper = new ObjectMapper();
        try {
            res = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(bosInfo);
        } catch (JsonProcessingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            res = "";
        }
        System.out.println(res);
        try {
            res = new String(res.getBytes(), "utf8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            res = "";
        }
        return res;
    }
    
  3. 将修改完成的服务器代码重新编译打包为bos_meitu_app_server.jar,将jar