android 文件流的方式多张图片上传,并多个参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 文件流的方式多张图片上传,并多个参数相关的知识,希望对你有一定的参考价值。

参考技术A

android 开发中图片上传是很正常的,有两种可用的方式:

下面我们就说明一下以文件流上传图片的方式, 实现网络框架是Retrofit

测试上传3张手机sd卡中的图片,并传人了参数EquipmentCode, Description, ReportUserCode等

其中的思路是: Post的方式,Content-Type:multipart/form-data的类型进行上传文件的。

其中MultipartBody是RequestBody的扩展,

看看请求头的信息, 请求中携带了所有信(如果接口开发人员说不能收到, 叫他自己想想,截图给他,哈哈哈:)

上面的是上传了3张图片,如果一张,只要传一个就行!

就这样,图片上传的两种方式ok拉,测试通过的,保证正确!

参考: https://www.jianshu.com/p/acfefb0a204f

LayUI上传图片(文件)的时候,上传多张图片(文件)会调用多次接口,而我们想要让上传多个文件的时候只调用一次接口,怎么解决?

文章目录

LayUI上传图片(文件)的时候,上传多张图片(文件)会调用多次接口,而我们想要让上传多个文件的时候只调用一次接口,怎么解决?

如何把调用多次接口改为调用一次接口

现在出现了一个问题,我们在前端上传图片的时候想要上传多张图片,我们想要让它只访问一次接口,给我们后端传递一个文件集合对象,但是现在出现的问题是,我们如果在LayUi前端页面上传多个图片,结果会调用多次接口,并且每个接口传递给我们后端的参数只有一个文件,不是多个文件,如下图:

后端代码如下图:

看一下我们的layui是怎么写的,如下图:

所以这就会出现一个问题了,因为我们上传多张图片的时候,我们调用接口是一个一个接着调用的,所以你上传几个图片,那么我们就会调用多次次url代表的接口,那怎么解决呢?

我们上传图片的时候不要自动上传,如下图:

我们把所有的上传图片一次性获取到,封装到formData对象里面,然后调用一次ajax方法,如下图:

前端使用LayUi如何上传文件

html:

<button class="layui-btn" id="upload" type="button">
                               <i class="layui-icon">&#xe67c;</i>上传图片
                           </button>

js:

$(function () 
        layui.use(['upload','form'], function () 
            var upload = layui.upload;
            var form = layui.form;

            var files;
            upload.render(
                    elem: '#upload'
                    ,before(res) 
                       console.log(res);
                    
                    ,allDone: function(obj) //当文件全部被提交后,才触发
                       console.log(obj.total); //得到总文件数
                       console.log(obj.successful); //请求成功的文件数
                       console.log(obj.aborted); //请求失败的文件数
                       console.log(obj);
                    
                    ,multiple: true
                    ,number: 4
                    ,size: 5120 //图片上传的大小最大为5M
                    ,exts: "jpg|png|jpeg"
                    ,auto: false  //选定文件后不自动上传
                    ,choose: (obj) => 
                       files = obj.pushFile();
                    
            )

            form.on('submit(submitForm)',function (data) ``
                console.log(files);
                var formData = new FormData();
                for(let  i in files)
                    formData.append("files",files[i]);
                
                $.ajax(
                    type:'POST',
                    url: "/complaint/uploadImage",
                    data: formData,
                    processData: false,
                    contentType: false,
                    async: false,
                    dataType: "json",
                    success: function(result)
                        console.log(result);
                    
                );


            );

        );
    );

后端如何接收前端传递来的多个文件

如下图:

 @RequestMapping(value = "/uploadImage",method = RequestMethod.POST)
    @ResponseBody
    public JSONArray uploadImage(@RequestParam(value = "files") List<MultipartFile> files) throws IOException 
        //该json数组用来存放微信返回给我们的上传图片所对应的id
        JSONArray jsonArray = new JSONArray();

        //商户上传反馈图片API  地址
        String uri = "https://api.mch.weixin.qq.com/v3/merchant-service/images/upload";

        //遍历前端传递过来的图片,并且访问微信官方接口,把返回的图片id封装到一个json数组里面
        if(files != null && files.size()>0)
            for(int i=0;i<files.size();i++)
                MultipartFile file = files.get(i);

                //上传到这个文件夹
                String filePath = "D:/image";
                File filePathOther = new File(filePath);
                //如果没有的话创建一个文件夹
                if (!filePathOther.exists()) 
                    filePathOther.mkdirs();
                

                //文件全路径
                //路径+文件名
                //文件名:file.getOriginalFilename()
                String finalFilePath = filePath + "/" + file.getOriginalFilename().trim();
                //查看目录中是否已经存在该文件
                File desFile = new File(finalFilePath);
                //如果目录中不存在上传的文件,则直接在目录中下载文件
                if (!desFile.exists()) 
                    //把上传文件存储到该目录中
                    file.transferTo(desFile);
                

                //把文件的全路径传递给微信“上传商户图片API接口”
                try 
                    String mediaId = HttpClientUtil.uploadImg(finalFilePath, uri, testMchId, testMchSerialNo, testApiV3Key, testPrivateKey);
                    jsonArray.add(mediaId);
                 catch (Exception e) 
                    log.error("WeiXinComplaintController中的uploadImage方法调用微信官方接口出错");
                    e.printStackTrace();
                
            
        

        return jsonArray;
    

前端页面图

以上是关于android 文件流的方式多张图片上传,并多个参数的主要内容,如果未能解决你的问题,请参考以下文章

将多张图片从图库上传到android中的服务器

Android之修改用户头像并上传服务器(实现手机拍照和SD卡选择上传)

Firebase 存储 - 在 Android 中上传多个图像文件

LayUI上传图片(文件)的时候,上传多张图片(文件)会调用多次接口,而我们想要让上传多个文件的时候只调用一次接口,怎么解决?

LayUI上传图片(文件)的时候,上传多张图片(文件)会调用多次接口,而我们想要让上传多个文件的时候只调用一次接口,怎么解决?

Android OkHttp3 上传多张图片