不得不承认,用着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);
}
});
}
实际操作
恩,乍一看,官方文档介绍的清晰明了,没啥问题。那好吧。开撸吧!结果……
方法过时
方法过时了?还报这么多错?好尴尬啊!
不过,仔细看了下需要的参数,发现并不需要传上下文,于是我把第一个参数删除了。虽然方法过时,但是还是可以用滴!
不过这也终究不是长久之计,过时了,说不定什么时候就淘汰了。那应该用哪个方法替代呢?我翻遍了文档,终于发现了这句话。
自BmobSDKv3.4.6开始,文件批量上传的静态方法由Bmob转移至BmobFile类,建议调用BmobFile.uploadBatch方法。
于是乎,终极解决方案:
成功,成功,成功?
上传了三张图片,在成功的方法里打了个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--表示总的上传进度(百分比)
}
});