微信小程序多文件上传(docx,ppt,pdf,zip,jpg···)

这遍文章主要介绍下,在小程序的开发过程中实现多个文件上传的实现方法。

chooseMessageFile

使用这一种方式进行多文件的上传时,就是说从客户端会话选择文件,下面是chooseMessageFile的一些参数:

count : 表示最多选择的文件个数,可以是0~100的数;

type : 表示选择的文件的类型,默认为all;

success : 表示接口调用成功时的回调函数;

fail : 表示接口调用失败的回调函数;

complete : 接口调用结束的回调函数(调用成功、失败都会执行)。

在进行接口调用时,success回调函数附带文件的相关信息,包含于tempFiles中,可以通过获取获取的信息进行下一步的上传操作。例如打印success的返回信息:

wx.chooseMessageFile({
      count: 5,
      type: 'image',
      success(res) {
      console.log(res)
   }
})

在进行文件的uploadFile时由于参数filePath要的是上传资源的路径,所以说只能一个一个的上传,而所需要的路径恰恰是tempFiles中每一项的path属性,所以在一个文件的时候就会非常好办。

直接上的代码吧!

wx.chooseMessageFile({
      count: 5,
      type: 'all',
      success(file) {
           wx.uploadFile({
                url: 'xxxxxxxxxxxxx',
                filePath: file.tempFiles[0].path,
                name: 'file',
                formData: {
                    //其他需要参数
                },
                success(res) {
                    //成功回调函数
                }
           })
      }
})

但是在进行多文件上传的时候,就会出现一些问题,我是通过定时器进行循环上传的,如果文件小的话,还是需要等待那么久的时间,而如果文件大了的话,就会超过定时器规定的时间,导致数组tempFiles的报错,下面是我错误的案例:

wx.chooseMessageFile({
      count: 5,
      type: 'all',
      success(file) {
        var NUMBER = 0;
        var timer = setInterval(function () {
          if (NUMBER < file.tempFiles.length) {
            wx.uploadFile({
              url: 'xxxxxxxxxxxxxxxxx',
              filePath: file.tempFiles[NUMBER].path,
              name: 'file',
              formData: {
                //提交数据
              },
              success(res) {
                NUMBER++;
                if (NUMBER == file.tempFiles.length){
                  clearInterval(timer);
                  //上传成功提示
                }
              }
            })
          }
        }, 2000)
      }
    })

最后发现文件的大小对上传的影响简直太大了,想办法只能在第一个文件上传完毕后再去上传第二个文件,在改bug的过程中,想到了算法里的递归调用,函数调用自身的方法,所以最后的实现方法:

1、定义函数

function uploadFile(fileTemp, NUMBER, formId,set){
  wx.uploadFile({
    url: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
    filePath: fileTemp[NUMBER].path,
    name: 'file',
    formData: {
        //上传数据
    },
    success(res) {
      set.setData({
        'TIP': '第' + (NUMBER+1) + '个文件上传成功'
      });
      console.log(res);
      if (NUMBER+1 == fileTemp.length) {
        wx.showModal({
          title: '提示',
          content: '上传成功',
          success: function (res) {
            wx.switchTab({
              url: "/pages/submit/submit"
            })
          }
        })
      } else {
        uploadFile(fileTemp, NUMBER+1, formId,set);
      }
    }
  })
}

2、选择文件并调用

wx.chooseMessageFile({
      count: 10,
      type: 'all',
      success(file) {
           change.setData({
               'TIP': '文件上传中'
           });
           uploadFile(file.tempFiles, 0, formId,change);
      }
})

web-view

web-view是承载网页的容器。会自动铺满整个小程序页面,说到底就是在进行文件上传的时候还是通过原来的H5的form表单进行提交数据,而web-view负责把这个页面放进小程序里,下面是他的部分属性:

src:webview:指向网页的链接。可打开关联的公众号的文章,其它网页需登录小程序管理后台配置业务域名;

bindmessage:网页向小程序 postMessage 时,会在特定时机(小程序后退、组件销毁、分享)触发并收到消息。e.detail = { data },data是多次 postMessage 的参数组成的数组;

bindload:网页加载成功时候触发此事件。e.detail = { src ;

binderror:网页加载失败的时候触发此事件。e.detail = { src };

需要注意的是:

1、网页内 iframe 的域名也需要配置到域名白名单。

2、开发者工具上,可以在web-view组件上通过右键 - 调试,打开web-view组件的调试。

3、每个页面只能有一个 web-view,web-view 会自动铺满整个页面,并覆盖其他组件。

4、web-view网页与小程序之间不支持除 JSSDK 提供的接口之外的通信。

5、在 iOS 中,若存在JSSDK接口调用无响应的情况,可在web-view的 src 后面加个#wechat_redirect解决。

6、避免在链接中带有中文字符,在 iOS 中会有打开白屏的问题,建议加一下 encodeURIComponent。

引入方式:

<web-view  src='H5页面的地址'></web-view>      <!--注意:页面需要配置白名单-->

<!DOCTYPE html>
<html>
	<head>
		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
		<meta charset="UTF-8">
		<title>文件上传</title>
		<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
		<script src="http://malsup.github.io/min/jquery.form.min.js"></script>
		<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
		<style type="text/css">
			body,html{
				width: 100%;
				height: 100%;
				margin: 0;
			}
			#form{
				width: 100%;
				height: 100%;
				display: flex;
				flex-direction:column;
				justify-content:center;
				align-items:center;
			}
			.oldFile{
				display:none;
			}
			.newFile{
				width: 150px;
				height: 150px;
				border-radius: 50%;
				background-color: #10a78e;
				text-align: center;
				line-height: 150px;
				color: white;
			}
			.btn{
				width: 150px;
				height: 45px;
				background-color: #c1c1c1;
				color:white;
				outline: none;
				border: 0;
				border-radius: 10px;
			}
			.filename{
				width: 100%;
				height: 120px;
				margin: 50px 0;
				line-height: 24px;
				text-align: center;
			}
		</style>
	</head>
	<body>
		<form id="form" action="http://underwriting.algerfan.cn/underwriting/upload" method="post" enctype="multipart/form-data">
			<div class="newFile">选择文件</div>
			<div class="filename"></div>
			<input type="submit" value="上传文件" class="btn">
			<input class="encryptedData" style="display: none;" type="text" name="encryptedData" />
			<input class="iv" style="display: none;" type="text" name="iv" />
			<input class="code" style="display: none;" type="text" name="code" />
            <input class="name" style="display: none;" type="text" name="name" />
			<input type="file" name="file" class="oldFile">
		</form>
	</body>
	<script type="text/javascript">
		function getUrlParam(name) {
			var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
			var r = window.location.search.substr(1).match(reg);
			if (r != null) return unescape(r[2]);
			return null;
		}
		var encryptedData = getUrlParam('encryptedData');
		var iv = getUrlParam('iv');
		var code = getUrlParam('code');
		var name = getUrlParam('name');
		$('.encryptedData').val(encryptedData);
		$('.iv').val(iv);
		$('.code').val(code);
        $('.name').val(name);
		var INPUTINDEX = 0;
		$('.newFile').click(function(){
			$(".oldFile").eq(INPUTINDEX).change(function(){
				$('.newFile').css('line-height','20px');
				$('.newFile').css('padding-top','45px');
				$('.newFile').css('height','105px');
				$('.newFile').html('继续选择'+'<br/>'+'点击不需要的文'+'<br/>'+'件进行删除');
				var NAME = getfilename(INPUTINDEX);
				var NODE = '<div class="names">'+NAME+'</div>';
				$('.filename').append(NODE);
				$('.btn').css('background-color','#10a78e');
			})
			if(INPUTINDEX>4){
				alert('最多添加五个文件');
			}else if(INPUTINDEX==4){
				$('.oldFile').eq(INPUTINDEX).click();
				INPUTINDEX++;
			}else{
				var newinput = '<input type="file" name="file" class="oldFile">';
				$('#form').append(newinput);
				$('.oldFile').eq(INPUTINDEX).click();
				INPUTINDEX++;
			}
		});
		function getfilename(index){
		    var file = $(".oldFile").eq(index-1).val();
		    var name = file.lastIndexOf("\\");
		    var fileName = file.substring(name+1); 
			return fileName;
		}
		setInterval(function(){
			$('.names').click(function(){
				var INDEX = $(this).index();
				$(this).remove();
				var text = document.getElementsByClassName('oldFile')[INDEX];
				document.getElementById('form').removeChild(text);
				INPUTINDEX--;
			})
		},100)
		$(function(){
			$("#form").ajaxForm(function(data){
				if(data.code==1){
					wx.miniProgram.switchTab({url: '/pages/submit/submit'})
					wx.miniProgram.postMessage({ data: 'foo' })
					wx.miniProgram.postMessage({ data: {foo: 'bar'} })
				}
			});     
		});
	</script>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ღ故里᭄ꦿ࿐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值