
前言:
????由于后臺(tái)接收POST提交數(shù)據(jù)格式為application/x-www-form-urlencoded,帶文件要用form-data導(dǎo)致圖片上傳不了服務(wù)器,首先我們看下:
form編碼方式application/x-www-form-urlencoded和multipart/form-data的區(qū)別
form元素有個(gè)enctype屬性,可以指定數(shù)據(jù)編碼方式,有如下三種:
1. application/x-www-form-urlencoded: 表單數(shù)據(jù)編碼為鍵值對(duì),&分隔
2. multipart/form-data: 表單數(shù)據(jù)編碼為一條消息,每個(gè)控件對(duì)應(yīng)消息的一部分
3. text/plain: 表單數(shù)據(jù)以純文本形式進(jìn)行編碼
決定使用七牛來解決這個(gè)問題,在使用過程中,我集成七牛SDK,并閱讀文檔,發(fā)現(xiàn)并沒有批量上傳圖片方式,在表單上傳方法只提供了單圖上傳方法,我第一瞬間內(nèi)心就拒絕for循環(huán)遍歷上傳的...
簡(jiǎn)單上傳
//指定zone的具體區(qū)域
//FixedZone.zone0 華東機(jī)房
//FixedZone.zone1 華北機(jī)房
//FixedZone.zone2 華南機(jī)房
//FixedZone.zoneNa0 北美機(jī)房
//自動(dòng)識(shí)別上傳區(qū)域
//AutoZone.autoZone
//Configuration config = new Configuration.Builder()
//.zone(Zone.autoZone)
//.build();
//UploadManager uploadManager = new UploadManager(config);
data = <File對(duì)象、或 文件路徑、或 字節(jié)數(shù)組>
String key = <指定七牛服務(wù)上的文件名,或 null>;
String token = <從服務(wù)端SDK獲取>;
uploadManager.put(data, key, token,
new UpCompletionHandler() {
@Override
public void complete(String key, ResponseInfo info, JSONObject res) {
//res包含hash、key等信息,具體字段取決于上傳策略的設(shè)置
if(info.isOK()) {
Log.i("qiniu", "Upload Success");
} else {
Log.i("qiniu", "Upload Fail");
//如果失敗,這里可以把info信息上報(bào)自己的服務(wù)器,便于后面分析上傳錯(cuò)誤原因
}
Log.i("qiniu", key + ",\r\n " + info + ",\r\n " + res);
}
}, null);
我就想到遞歸,隊(duì)列,線程...這些名詞就浮現(xiàn)在腦海中
下面帶著讀友從引用Gradle開始
1.注冊(cè)/登錄開發(fā)者中心
2.引用七牛包
implementation 'com.qiniu:qiniu-android-sdk:7.3.12'
3.模擬獲取手機(jī)圖片資源
//存放圖片路徑的集合
if (pathResult.size() > 0) {
int picSize = pathResult.size();
for (int i = 0; i < picSize; i++) {
QiNiuUtils.getUpimg(pathResult.get(i),picSize,mHandler);
}
}
4.這里利用Handler來體現(xiàn)它的結(jié)構(gòu)清晰,功能明確,圖片資源上傳七牛后,把回調(diào)的圖片路徑存放Message中,handle發(fā)送,頁(yè)面刷新數(shù)據(jù).
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
Bundle bundle = msg.getData();
if(null != bundle){
resultPathResult = bundle.getStringArrayList("resultImagePath");
Log.d("RentalReleaseActivity",resultPathResult.size()+"======"+resultPathResult.toString());
}
break;
default:
break;
}
}
};
5.啟動(dòng)線程來實(shí)現(xiàn)批量上傳資源
Thread() run()方法保證了線程的有序性
/**
* 描述: 七牛上傳多圖
* @param imagePath 圖片的本地路徑
* @param picSize 上傳圖片總數(shù)量
* @param mHandler Handler
* @author JayGengi
* @date 2018/7/27 0027 下午 5:26
*/
public static ArrayList<String> resultImagePath = new ArrayList<>();
public static void getUpimg(String imagePath,int picSize,Handler mHandler) {
new Thread() {
private SimpleDateFormat sdf;
private UploadManager uploadManager;
public void run() {
// 圖片上傳到七牛 重用 uploadManager
uploadManager = new UploadManager();
sdf = new SimpleDateFormat("yyyyMMddHHmmss");
// 設(shè)置圖片名字
String key = "icon_" +imagePath+""+sdf.format(new Date());
uploadManager.put(imagePath, key,token,
new UpCompletionHandler() {
@Override
public void complete(String key, ResponseInfo info,
JSONObject res) {
// 七牛返回的文件名
resultImagePath.add(key);
//將七牛返回圖片的文件名添加到list集合中
//list集合中圖片上傳完成后,發(fā)送handler消息回主線程進(jìn)行其他操作
if (picSize == resultImagePath
.size()) {
Bundle bundle = new Bundle();
bundle.putStringArrayList("resultImagePath",resultImagePath);
Message message = new Message();
message.what = 1;
message.setData(bundle);
mHandler.sendMessage(message);
}
}
}, null);
}
}.start();
}
Question:
同事建議集合EventBus和Rxjava來實(shí)現(xiàn)
- 首先我贊同的是可以把Handle換成EventBus,Eventbus能夠解耦,把本該有聯(lián)系的需要傳引用的給簡(jiǎn)化, 由它來分發(fā)事件了,不需要Handle來分布事件,簡(jiǎn)化了它的事件繁瑣;
- RxJava與七牛結(jié)合封裝進(jìn)行上傳,對(duì)于RxJava的話,我是真沒接觸過,也領(lǐng)略過它的強(qiáng)大,表示要學(xué)習(xí)一波~