不得不承認(rèn),用著Bmob提供的后端云的感覺倍兒爽,省了服務(wù)器不說,安卓端的代碼也簡(jiǎn)化了不少,聯(lián)網(wǎng)異步什么的都不用管了。不過,今天在上傳圖片期間遇到一些坑,查了文檔也沒找到個(gè)之乎所以然,在此做一下記錄。權(quán)當(dāng)備忘。
目的
我想做的是類似于朋友圈的那種,一個(gè)用戶發(fā)表一個(gè)動(dòng)態(tài),動(dòng)態(tài)里面包含若干文字以及若干圖片。今天僅就這幾張圖片的上傳來說說。
官方說法
恩。官方文檔的說法:
上傳一條多個(gè)文件的數(shù)據(jù)
往Music表中插入一條有兩個(gè)文件的數(shù)據(jù)的邏輯,首先進(jìn)行文件的同步上傳操作,示例代碼如下:
String[] filePaths = new String[2];
filePaths[0] = filePath_mp3;
filePaths[1] = filePath_lrc;
Bmob.uploadBatch(this, filePaths, new UploadBatchListener() {
@Override
public void onSuccess(List<BmobFile> files,List<String> 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{
//有可能上傳不完整,中間可能會(huì)存在未上傳成功的情況,你可以自行處理
}
}
@Override
public void onError(int statuscode, String errormsg) {
// TODO Auto-generated method stub
ShowToast("錯(cuò)誤碼"+statuscode +",錯(cuò)誤描述:"+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);
}
});
上傳成功之后,再進(jìn)行數(shù)據(jù)的添加操作。示例代碼如下:
private void insertObject(final BmobObject obj){
obj.save(MainActivity.this, new SaveListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
ShowToast("-->創(chuàng)建數(shù)據(jù)成功:" + obj.getObjectId());
}
@Override
public void onFailure(int arg0, String arg1) {
// TODO Auto-generated method stub
ShowToast("-->創(chuàng)建數(shù)據(jù)失敗:" + arg0+",msg = "+arg1);
}
});
}
實(shí)際操作
恩,乍一看,官方文檔介紹的清晰明了,沒啥問題。那好吧。開擼吧!結(jié)果……
方法過時(shí)
方法過時(shí)了?還報(bào)這么多錯(cuò)?好尷尬啊!
不過,仔細(xì)看了下需要的參數(shù),發(fā)現(xiàn)并不需要傳上下文,于是我把第一個(gè)參數(shù)刪除了。雖然方法過時(shí),但是還是可以用滴!
不過這也終究不是長久之計(jì),過時(shí)了,說不定什么時(shí)候就淘汰了。那應(yīng)該用哪個(gè)方法替代呢?我翻遍了文檔,終于發(fā)現(xiàn)了這句話。
自BmobSDKv3.4.6開始,文件批量上傳的靜態(tài)方法由Bmob轉(zhuǎn)移至BmobFile類,建議調(diào)用BmobFile.uploadBatch方法。
于是乎,終極解決方案:
成功,成功,成功?
上傳了三張圖片,在成功的方法里打了個(gè)log,結(jié)果發(fā)現(xiàn)這個(gè)log打印了3遍。關(guān)于這個(gè)問題,恩,官方文檔說的很清楚。
有多少個(gè)文件上傳成功,onSuccess方法就會(huì)執(zhí)行多少次;
大家可以通過onSuccess回調(diào)方法中的files或urls集合的大小與要上傳的總文件個(gè)數(shù)比較,如果一樣,則表示全部文件上傳成功。
示例代碼如下:
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<BmobFile> files,List<String> urls) {
//1、files-上傳完成后的BmobFile集合,是為了方便大家對(duì)其上傳后的數(shù)據(jù)進(jìn)行操作,例如你可以將該文件保存到表中
//2、urls-上傳文件的完整url地址
if(urls.size()==filePaths.length){//如果數(shù)量相等,則代表文件全部上傳完成
//do something
}
}
@Override
public void onError(int statuscode, String errormsg) {
ShowToast("錯(cuò)誤碼"+statuscode +",錯(cuò)誤描述:"+errormsg);
}
@Override
public void onProgress(int curIndex, int curPercent, int total,int totalPercent) {
//1、curIndex--表示當(dāng)前第幾個(gè)文件正在上傳
//2、curPercent--表示當(dāng)前上傳文件的進(jìn)度值(百分比)
//3、total--表示總的上傳文件數(shù)
//4、totalPercent--表示總的上傳進(jìn)度(百分比)
}
});