
前言:
由于后台接收POST提交数据格式为application/x-www-form-urlencoded,带文件要用form-data导致图片上传不了服务器,首先我们看下:
form编码方式application/x-www-form-urlencoded和multipart/form-data的区别
form元素有个enctype属性,可以指定数据编码方式,有如下三种:
1. application/x-www-form-urlencoded: 表单数据编码为键值对,&分隔
2. multipart/form-data: 表单数据编码为一条消息,每个控件对应消息的一部分
3. text/plain: 表单数据以纯文本形式进行编码
决定使用七牛来解决这个问题,在使用过程中,我集成七牛SDK,并阅读文档,发现并没有批量上传图片方式,在表单上传方法只提供了单图上传方法,我第一瞬间内心就拒绝for循环遍历上传的...
简单上传
//指定zone的具体区域
//FixedZone.zone0 华东机房
//FixedZone.zone1 华北机房
//FixedZone.zone2 华南机房
//FixedZone.zoneNa0 北美机房
//自动识别上传区域
//AutoZone.autoZone
//Configuration config = new Configuration.Builder()
//.zone(Zone.autoZone)
//.build();
//UploadManager uploadManager = new UploadManager(config);
data = <File对象、或 文件路径、或 字节数组>
String key = <指定七牛服务上的文件名,或 null>;
String token = <从服务端SDK获取>;
uploadManager.put(data, key, token,
new UpCompletionHandler() {
@Override
public void complete(String key, ResponseInfo info, JSONObject res) {
//res包含hash、key等信息,具体字段取决于上传策略的设置
if(info.isOK()) {
Log.i("qiniu", "Upload Success");
} else {
Log.i("qiniu", "Upload Fail");
//如果失败,这里可以把info信息上报自己的服务器,便于后面分析上传错误原因
}
Log.i("qiniu", key + ",\r\n " + info + ",\r\n " + res);
}
}, null);
我就想到递归,队列,线程...这些名词就浮现在脑海中
下面带着读友从引用Gradle开始
1.注册/登录开发者中心
2.引用七牛包
implementation 'com.qiniu:qiniu-android-sdk:7.3.12'
3.模拟获取手机图片资源
//存放图片路径的集合
if (pathResult.size() > 0) {
int picSize = pathResult.size();
for (int i = 0; i < picSize; i++) {
QiNiuUtils.getUpimg(pathResult.get(i),picSize,mHandler);
}
}
4.这里利用Handler来体现它的结构清晰,功能明确,图片资源上传七牛后,把回调的图片路径存放Message中,handle发送,页面刷新数据.
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.启动线程来实现批量上传资源
Thread() run()方法保证了线程的有序性
/**
* 描述: 七牛上传多图
* @param imagePath 图片的本地路径
* @param picSize 上传图片总数量
* @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");
// 设置图片名字
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集合中图片上传完成后,发送handler消息回主线程进行其他操作
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来实现
- 首先我赞同的是可以把Handle换成EventBus,Eventbus能够解耦,把本该有联系的需要传引用的给简化, 由它来分发事件了,不需要Handle来分布事件,简化了它的事件繁琐;
- RxJava与七牛结合封装进行上传,对于RxJava的话,我是真没接触过,也领略过它的强大,表示要学习一波~
网友评论