美文网首页微信小程序知识微信小程序小程序学习
小程序之一次性上传多个本地相片

小程序之一次性上传多个本地相片

作者: Java面试官 | 来源:发表于2017-01-23 01:21 被阅读6844次

    说在前面

    最近由于项目需要所以学了下小程序,也做了一些东西,随后便有了以下的一些总结了,现在说说如何使用小程序一次性上传多个本地相片。


    问题描述

    最近做项目的时候要实现一个上传相片的功能,用了微信提供的api之后发觉很容易就做出来了,在pc端调试也没有弊端,但是等到我用真机调试的时候就发现出问题了,问题就是在真机调试的时候无法一次性上传多张图片。


    老规矩,以源码为导向


    photos.js

    //部分参数我就不抽出了,关键是看实现机制
    var app = getApp();
    var baseUrl = app.baseUrl;
    //上传图片的路径
    var uploadUrl = baseUrl+'pictureController/insertPic';
    var array = [];
    var owerId = '33aef7e0ac1b11e6af9f142d27fd7e9e';
    var albumId;
    var pageSize = 9;
    var currentPage = 1;
    var cryUrl = app.cryUrl;
    Page({
      data: {
            hasMore:false,
    
            cryUrl:cryUrl,
    
            clientHeight:0,
    
            // 图片布局列表(二维数组,由`albumList`计算而得)
            layoutList: [],
    
            // 布局列数
            layoutColumnSize: 3,
    
            // 是否显示loading
            showLoading: false,
    
            // loading提示语
            loadingMessage: '',
    
            // 是否显示toast
            showToast: false,
    
            // 提示消息
            toastMessage: '',
    
            // 是否显示动作命令
            showActionsSheet: false,
    
            // 当前操作的图片
            imageInAction: '',
    
            // 图片预览模式
            previewMode: false,
    
            // 当前预览索引
         previewIndex: 0,
         images_upload: '../resources/images/camera.png',
         imageBaseUrl : baseUrl+"pictures/"
      },
      /* 函数描述:作为上传文件时递归上传的函数体体;
       * 参数描述: 
       * filePaths是文件路径数组
       * successUp是成功上传的个数
       * failUp是上传失败的个数
       * i是文件路径数组的指标
       * length是文件路径数组的长度
       */      
        uploadDIY(filePaths,successUp,failUp,i,length){
          wx.uploadFile({
                        url: uploadUrl, 
                        filePath: filePaths[i],
                        name: 'fileData',
                        formData:{
                          'pictureUid': owerId,
                          'pictureAid': albumId
                        },
                        success: (resp) => {
                            successUp++;
                        },
                        fail: (res) => {
                            failUp ++;
                        },
                        complete: () => {
                            i ++;                        
                            if(i == length)
                            {                      
                              this.showToast('总共'+successUp+'张上传成功,'+failUp+'张上传失败!');
                            }
                            else
                            {  //递归调用uploadDIY函数
                                this.uploadDIY(filePaths,successUp,failUp,i,length);
                            }
                        },
                    });
      },
      uploadImage:function(e){
        wx.chooseImage({
            count: 9,
                sizeType: ['original', 'compressed'],
                sourceType: ['album', 'camera'],
                success: (res) => {
       
                    var successUp = 0; //成功个数
                    var failUp = 0; //失败个数
                    var length = res.tempFilePaths.length; //总共个数
                    var i = 0; //第几个
                   this.uploadDIY(res.tempFilePaths,successUp,failUp,i,length);
                },        
        });
      }
    })
    

    那么如何使用呢?

    修改了uploadUrl之后,直接调用 uploadImage 函数即可。


    我使用用递归的方式来多次上传选中的图片的原因?

    小程序的官方文档有提到, wx.uploadFile一次只能上传一张图片,而我用了for循环多次上传的在pc端调试可以上传多张成功,但是在真机调试的时候却还是只能上传一张,于是我便投机在上传成功之后再次调取wx.uploadFile进行上传,结果成功了,为了代码整洁我便用了递归的方式进行调用。


    Note:发布的这些文章全都是自己边学边总结的,难免有纰漏,如果发现有不足的地方,希望可以指出来,一起学习咯,么么哒。
    开源爱好者,相信开源的力量必将改变世界:
    ** osc :** https://git.oschina.net/xi_fan
    github: https://github.com/wiatingpub

    相关文章

      网友评论

      • 小卓呀:看了博主的文章,收获很大。自己动手去实现了下。自己是小程序刚入门。尝试了下for循环上传的情况,发现用pc端的开发者工具和手机实际测试都是可以的。

        代码如下:
        for (var i = 0; i < tempFilePaths.length;i++){
        wx.uploadFile({
        url: baseURL+'Test/upload',
        filePath: tempFilePaths[i],
        header: {
        "content-type": "multipart/form-data"
        },
        name:'file',
        success: function (res) {
        var data = res.data
        successUp++;//已成功上传的图片数目
        console.log(successUp);
        },
        fail: function (res){
        failUp++;//上传失败的数目
        console.log(failUp);
        }
        });
        }

        后端是用thinkphp3.2写的。在本地服务器测试(我把https验证关掉了),开了WiFi,手机联上自己的电脑WiFi,就可以访问到数据了。手机扫了开发者工具生成的二维码,测试也是可以的。

        有个问题想请教下:如果是一个表单里有多张图片要上传,还有其他的字段数据(比如 用户名,密码等) 我感觉是不是后端需要两个接口来接收这些数据?比如,一个upload接口处理图片上传,另一个接口处理其他数据。会这样想的原因是每次只可以实现一张图片的上传,实际就是重复调用upload接口,如果在upload接口处理数据的话,会重复处理其他数据的...
        02707b872260:您好, 我也有这样的疑惑,同样想咨询一下这样的问题你们是如何在编程里处理解决的?
      • 知晓程序:你好!我们是爱范儿旗下专注于小程序生态的公众号知晓程序(微信号 zxcx0101)。我们很赞赏你的文章,希望能获得转载授权。授权后,你的文章将会在知晓程序社区(minapp.com)、爱范儿、AppSo 等渠道发布,我们会注明来源和作者姓名。

        非常感谢~~~
        知晓程序:@李锡钒 感谢~
        Java面试官: @知晓程序 可以

      本文标题:小程序之一次性上传多个本地相片

      本文链接:https://www.haomeiwen.com/subject/spsnbttx.html