Android之上传多个文件至php服务器,php服务器只能接收最后一个文件问题

在维护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  


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值