0824 Bmob后端云上传多张图片

不得不承认,用着Bmob提供的后端云的感觉倍儿爽,省了服务器不说,安卓端的代码也简化了不少,联网异步什么的都不用管了。不过,今天在上传图片期间遇到一些坑,查了文档也没找到个之乎所以然,在此做一下记录。权当备忘。

目的

我想做的是类似于朋友圈的那种,一个用户发表一个动态,动态里面包含若干文字以及若干图片。今天仅就这几张图片的上传来说说。

官方说法

恩。官方文档的说法:

上传一条多个文件的数据

往Music表中插入一条有两个文件的数据的逻辑,首先进行文件的同步上传操作,示例代码如下:

String[] filePaths = new String[2];
filePaths[0] = filePath_mp3;
filePaths[1] = filePath_lrc;
Bmob.uploadBatch(this, filePaths, new UploadBatchListener() {

    @Override
    public void onSuccess(List files,List urls) {
        // TODO Auto-generated method stub
        Log.i("life","insertDataWithMany -onSuccess :"+urls.size()+"-----"+files+"----"+urls);
        if(urls.size()==2){//如果全部上传完,则更新该条记录
            Song song =new Song("汪峰0","北京北京0",files.get(0),files.get(1));
            insertObject(song);
        }else{
            //有可能上传不完整,中间可能会存在未上传成功的情况,你可以自行处理
        }
    }

    @Override
    public void onError(int statuscode, String errormsg) {
        // TODO Auto-generated method stub
        ShowToast("错误码"+statuscode +",错误描述:"+errormsg);
    }

    @Override
    public void onProgress(int curIndex, int curPercent, int total,
            int totalPercent) {
        // TODO Auto-generated method stub
        Log.i("life","insertBatchDatasWithOne -onProgress :"+curIndex+"---"+curPercent+"---"+total+"----"+totalPercent);
    }
});

上传成功之后,再进行数据的添加操作。示例代码如下:

private void insertObject(final BmobObject obj){
    obj.save(MainActivity.this, new SaveListener() {

        @Override
        public void onSuccess() {
            // TODO Auto-generated method stub
            ShowToast("-->创建数据成功:" + obj.getObjectId());

        }

        @Override
        public void onFailure(int arg0, String arg1) {
            // TODO Auto-generated method stub
            ShowToast("-->创建数据失败:" + arg0+",msg = "+arg1);
        }
    });
}

实际操作

恩,乍一看,官方文档介绍的清晰明了,没啥问题。那好吧。开撸吧!结果……

方法过时

0824 Bmob后端云上传多张图片_第1张图片
这里写图片描述

方法过时了?还报这么多错?好尴尬啊!

不过,仔细看了下需要的参数,发现并不需要传上下文,于是我把第一个参数删除了。虽然方法过时,但是还是可以用滴!


0824 Bmob后端云上传多张图片_第2张图片
这里写图片描述

不过这也终究不是长久之计,过时了,说不定什么时候就淘汰了。那应该用哪个方法替代呢?我翻遍了文档,终于发现了这句话。

自BmobSDKv3.4.6开始,文件批量上传的静态方法由Bmob转移至BmobFile类,建议调用BmobFile.uploadBatch方法。

于是乎,终极解决方案:


0824 Bmob后端云上传多张图片_第3张图片
这里写图片描述

成功,成功,成功?

上传了三张图片,在成功的方法里打了个log,结果发现这个log打印了3遍。关于这个问题,恩,官方文档说的很清楚。
有多少个文件上传成功,onSuccess方法就会执行多少次;
大家可以通过onSuccess回调方法中的files或urls集合的大小与要上传的总文件个数比较,如果一样,则表示全部文件上传成功。

示例代码如下:

String filePath_mp3 = "/mnt/sdcard/testbmob/test1.png";
String filePath_lrc = "/mnt/sdcard/testbmob/test2.png";
final String[] filePaths = new String[2];
filePaths[0] = filePath_mp3;
filePaths[1] = filePath_lrc;
BmobFile.uploadBatch(filePaths, new UploadBatchListener() {

    @Override
    public void onSuccess(List files,List urls) {
        //1、files-上传完成后的BmobFile集合,是为了方便大家对其上传后的数据进行操作,例如你可以将该文件保存到表中
        //2、urls-上传文件的完整url地址
        if(urls.size()==filePaths.length){//如果数量相等,则代表文件全部上传完成
            //do something
        }
    }

    @Override
    public void onError(int statuscode, String errormsg) {
        ShowToast("错误码"+statuscode +",错误描述:"+errormsg);
    }

    @Override
    public void onProgress(int curIndex, int curPercent, int total,int totalPercent) {
        //1、curIndex--表示当前第几个文件正在上传
        //2、curPercent--表示当前上传文件的进度值(百分比)
        //3、total--表示总的上传文件数
        //4、totalPercent--表示总的上传进度(百分比)
    }
});

你可能感兴趣的:(0824 Bmob后端云上传多张图片)