需求

1.调用微信jsSDK选图或者拍照(选图支持选多图)

2.选图或者拍照后提供预览,但不把图片下载到服务器

3.提交表单的时候再一并提交,把图片下载到服务器

4.支持编辑页面删除已选图片(此图已经删除到微信服务器)

5.回到数据列表页后,支持点击预览wx.previewImage

(不建议使用原生的input type=file、enctype="multipart/form-data"的形式进行上传)


我的思路(关于需求1、2、3):

1.需要初始化jsSDK。

2.点击某个按钮,调用wx.chooseImage给用户展示选图、拍照的选择。

3.用户选择多图或者拍照操作完成后(wx.uploadImage回调中),上传这些图片到微信服务器,同时执行预览的渲染操作。

4.点击保存按钮,提交最后确认的几个图片,访问后台进行图片、数据的保存操作



前端代码

var basePath = "/demoProject/";
/**常量配置*/
var UPDOC_CONST = {
	MAX_FILE_NUM : 9//每个动态上传文件的个数
}
//定义后台访问的入口
var srvPaths = {
	WXJSSDKCONFIG:			basePath + "wx/jsSdk/config"//获取微信jsSdk配置    
}
/*--------------------------------------------------------------共用service--------------------------------------------------------------*/
var updocSrv_Commen = {/**共用*/
	getWxJsSdkConfig : function(params,s,f){
		$.post(srvPaths.WXJSSDKCONFIG,params||{},function(res){
			res&&res.success ? s&&s(res) : f&&f(res);
		});
	}
}
/*--------------------------------------------------------------END共用service--------------------------------------------------------------*/

/*--------------------------------------------------------------JS-SDK--------------------------------------------------------------*/
/*图片接口参考:*/
var updoc_wxJsSdk = {
	/**注入SDK权限配置【思路第1步】*/
	iniWxJsSDK : function(){
		var _this = this;
		//通过config接口注入权限验证配置
		updocSrv_Commen.getWxJsSdkConfig({url:location.href},function(res){
			var c = res.result;
			wx.config({
  			 debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  			 appId: c.appid, // 必填,公众号的唯一标识
  			 timestamp: c.timestamp, // 必填,生成签名的时间戳
  			 nonceStr: c.noncestr, // 必填,生成签名的随机串
  			 signature: c.signature,// 必填,签名,见附录1
  			 jsApiList: ["chooseImage","previewImage","uploadImage","downloadImage"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
  			});
		});
	},/**(编辑表单页面)上传图片第1步@param call 选图后的回调函数*/
	onChooseImage : function(call){
		var _this = this;
		var tmpl = '<li class="weui-uploader__file" data-src="#url#"><img src="#url#" style="width: 100%;max-height: 100%;"></li>'
		//点击“选图、拍照”按钮触发:【思路第2步】
		$("body").on("click",".uploaderInput",function(){
			var $input = $(this);
			var len = $input.closest(".weui-uploader__bd").find(".weui-uploader__files li").length;//已经选了几张?
			if(len >= UPDOC_CONST.MAX_FILE_NUM){
				return false;
			}
			var max = UPDOC_CONST.MAX_FILE_NUM - len;//还能选几张图?
			console.log("wx.chooseImage");
			wx.chooseImage({
			    count: max, // 默认9
			    sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
			    sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
			    success: function (res) {//【思路第三步】

			    	var localIds = res.localIds;
			    	/*这一段是处理页面预览
			    	 * for (i in localIds) {
			    		var src = localIds[i];
		    			$input.closest(".weui-uploader__bd").find(".weui-uploader__files").append($(tmpl.replace('#url#', src).replace('#url#', src)));
			    	}
			    	//是否继续显示上传“+”按钮
			    	len = $input.closest(".weui-uploader__bd").find(".weui-uploader__files li").length;//已经选了几张?
			    	if(len >= UPDOC_CONST.MAX_FILE_NUM){
			    		$input.closest(".weui-uploader__input-box").hide();
			    	}
			    	var serverIds = [];*/
			    	_this.uploadImage(localIds,serverIds,call);
			    }
			});
		});
	},/**(编辑表单页面)上传图片第2步:上传(微信服务器)(uploadImage接口是异步的,但不能同时调用多次,多图需要排队。)*/
	uploadImage : function(localIds,serverIds,call){
		var _this = this;
		if(localIds.length == 0){
			//所选图全部上传成功了
			console.log("全部上传成功serverIds:"+serverIds);
			call && call(serverIds);
		}else{
			var localId = localIds.pop();
			console.log("wx.uploadImage");
			wx.uploadImage({
        		localId: localId, // 需要上传的图片的本地ID,由chooseImage接口获得
        		isShowProgressTips: 1, // 默认为1,显示进度提示
        		success: function (res) {
        			serverIds.push(res.serverId); 返回图片的服务器端ID
        			console.log("排队上传图片到微信服务器成功serverId:"+res.serverId);
        			_this.uploadImage(localIds,serverIds,call);
        		}
    		});
		}
			
	},/**(编辑表单页面)配合onTapShowDelSheet,点击删除*/
	onDelFiles : function(call){
		var max = UPDOC_CONST.MAX_FILE_NUM;
		//确认删除某一个图
		$("body").on("click","#iosDelImgActionsheet .del-btn",function(e){
			$('#iosDelImgActionsheet').removeClass('weui-actionsheet_toggle');
        	$('#iosDelImgMask').fadeOut(200);
    		var index = $(this).attr("data-index");
			index = index?parseInt(index):-1;
    		$(".attachsPreviewWitchDel li").eq(index).remove();
			var l = $(".weui-uploader__bd .weui-uploader__files li").length;
			if(l < max){
				$(".weui-uploader__bd .weui-uploader__input-box").show();
			}
			call&&call(index);
		})
	},/**(编辑表单页面)点击一个图,给出删除提示:ActionSheet*/
	onTapShowDelSheet : function(){
		var _this = this;
		$("body").on("click",".attachsPreviewWitchDel li",function(){
			var index = $(this).index();
			$('#iosDelImgActionsheet').remove();
			$('#iosDelImgMask').remove();
			var tpl = '<div class="weui-mask" id="iosDelImgMask" style="opacity: 0; display: none;"></div> <div class="weui-actionsheet" id="iosDelImgActionsheet"> <div class="weui-actionsheet__title"> <p class="weui-actionsheet__title-text">删除此图片</p> </div> <div class="weui-actionsheet__menu"> <div class="weui-actionsheet__cell weui-cell_warn del-btn" data-index="{{data-index}}">删除</div> </div> <div class="weui-actionsheet__action"> <div class="weui-actionsheet__cell" id="iosDelImgActionsheetCancel">取消</div> </div> </div>';
			$("body").append(tpl.replace("{{data-index}}",index));
			var $iosActionsheet = $('#iosDelImgActionsheet');
	        var $iosMask = $('#iosDelImgMask');
	        function showActionSheet() {
    	        $iosActionsheet.addClass('weui-actionsheet_toggle');
	        	$iosMask.fadeIn(200);
	        }
	        function hideActionSheet() {
	            $iosActionsheet.removeClass('weui-actionsheet_toggle');
	            $iosMask.fadeOut(200);
	        }
	        setTimeout(function(){
	        	showActionSheet()
	        },100);
	        $iosMask.on('click', hideActionSheet);
	        $('#iosDelImgActionsheetCancel').on('click', hideActionSheet);
        });
	},/**(数据列表页面)点击附件,打开预览*/
	onPreview : function(){
		var _this = this;
		$("body").on("click",".attachsPreview li",function(){
			var lis = $(this).parent().find("li");
			var urls = [];
			$(lis).each(function(i){
				var url = $(this).attr("data-src");
				if(url.indexOf("http")!=0 && url.indexOf("https")!=0){
					//我们数据库存的相对路径,所以需要处理:url = domain + url;
				}
				urls.push(url);
			})
			wx.previewImage({
				current: urls[$(this).index()] , // 当前显示图片的http链接$(this).attr("data-src")
				urls: urls // 需要预览的图片http链接列表
			});
        });
	},
	init : function(){
		this.iniWxJsSDK();
		this.onPreview();
		this.onTapShowDelSheet();
		//this.onChooseImage();
	}
}
/*--------------------------------------------------------------END JS-SDK--------------------------------------------------------------*/
   

/*--------------------------------------------------------------班级荣誉save--------------------------------------------------------------*/
var updocCtrl_ClassSaveRongyu = {
	box : "#classSaveRongyuBox",
	serverIds : [],//注意:wx.chooseImage所选图最终放到这里
	/**点击发布【思路第四部】*/
	onSave : function(){
		var _this = this;
		$("body").on("click","#saveFormBtn",function(){
			var formData = new FormData($("#saveForm")[0]);
			for (var i = 0; i < _this.serverIds.length; i++) {  
				if(i<UPDOC_CONST.MAX_FILE_NUM){
					formData.append("serverIds", _this.serverIds[i]);
				}
		    }
			/*这里提交表单,请求后台
			 * updocSrv_Feed.add(formData,function(res){
				TjDialog.msg("发布成功",500,function(){
					location.href = srvPaths.CLASSRONGYU;
				});
			},function(res){
				res.msg&&TjDialog.alert(res.msg);
			})*/
		});
	},/**选择文件*/
	onChooseImage : function(){
		var _this = this;
		updoc_wxJsSdk.onChooseImage(function(serverIds){
			for (var i = 0; i < serverIds.length; i++) {  
	    		_this.serverIds.push(serverIds[i]);
		    }
		})
	},/**点击删除文件*/
	onDelFiles : function(){
		var _this = this;
		updoc_wxJsSdk.onDelFiles(function(index){
			_this.serverIds.splice(index, 1);
		});
	},
	init : function(){
		if($(this.box).length == 0){return false;}
		this.onSave();
		this.onChooseImage();
		this.onDelFiles();
	}
}
/*--------------------------------------------------------------END班级荣誉save--------------------------------------------------------------*/

/**===========上面定义了updoc_wxJsSdk、updocCtrl_ClassSaveRongyu,但是如何调用?===========*/
/**===========初始化微信jsSDK、初始化updocCtrl_ClassSaveRongyu===========*/
updoc_wxJsSdk.init();
updocCtrl_ClassSaveRongyu.init();


另外:需求4、5的实现方式,请参考js代码 对象中的以下方法:onDelFiles()、onTapShowDelSheet()、onPreview()