在维护OkHttp3开源库过程中经常面临一些使用者的问题反馈,例如增加或升级某种功能、出现bug、不会使用等。这些问题也只能一点一点解决,既然开源当然要尽自己最大能力负责到底,对他们提出的问题也得耐心的回答。
前不久升级了OkHttp3库,支持了单次请求上传多个文件功能。实现该功能时,我采用了基于SpringMVC的Java后台,完美通过测试。但是新功能上线不久后,就有同志反映说多个文件上传有问题,后台只能保存最后一个文件,前面的文件都丢失了。面临这样的问题难免有些尴尬,难不成我要搭建php开发环境进行测试下,想想都挺麻烦的,还是先审视下自己的前端代码吧。
/**
* 单次批量上传:一次请求上传多个文件
*/
private void doUploadBatch(){
imgList.clear();
imgList.add("/storage/emulated/0/okHttp_download/test.apk");
imgList.add("/storage/emulated/0/okHttp_download/test.rar");
HttpInfo.Builder builder = HttpInfo.Builder()
.setUrl(url);
//循环添加上传文件
for (String path: imgList ) {
builder.addUploadFile("uploadFile",path);
}
HttpInfo info = builder.build();
OkHttpUtil.getDefault(UploadFileActivity.this).doUploadFileAsync(info,new ProgressCallback(){
@Override
public void onProgressMain(int percent, long bytesWritten, long contentLength, boolean done) {
uploadProgress.setProgress(percent);
LogUtil.d(TAG, "上传进度:" + percent);
}
@Override
public void onResponseMain(String filePath, HttpInfo info) {
LogUtil.d(TAG, "上传结果:" + info.getRetDetail());
tvResult.setText(info.getRetDetail());
}
});
}
暂时没有发现什么问题,再看下底层源码:
for (UploadFileInfo fileInfo : uploadFileList){
if(progressCallback == null){
progressCallback = fileInfo.getProgressCallback();
}
String filePath = fileInfo.getFilePathWithName();
String interfaceParamName = fileInfo.getInterfaceParamName();
File file = new File(filePath);
log.append(interfaceParamName);
log.append("=");
log.append(filePath);
log.append(",");
mBuilder.addFormDataPart(interfaceParamName,
file.getName(),
RequestBody.create(MediaTypeUtil.fetchFileMediaType(filePath), file));
}
showLog(log.toString());
好吧,也没有发现什么不对的地方,根据那位同志的描述,php后台只能保存最后一个文件,那是不是php服务器不知道上传文件的参数uploadFile是数组呢?这种怀疑很有可能,因为Java是面向对象的,在数组转换过程很灵活,而php就不行了,php写法比较固定。思来想去如果把参数名称指定了数组类型,这样php后台应该就能正常接收了,我将这种设想告诉了他,让他尝试下,不到一分钟就回馈成功了,果不其然,下面就贴出修改后的代码:
//循环添加上传文件
for (String path: imgList ) {
//若服务器为php,接口文件参数名称后面追加"[]"表示数组,示例:builder.addUploadFile("uploadFile[]",path);
builder.addUploadFile("uploadFile[]",path);
}
如果你也遇到这种问题,可以参考下这个demo: https://github.com/MrZhousf/OkHttp3