精华内容
下载资源
问答
  • 开发图片上传组件

    2019-01-12 09:42:00
    2019独角兽企业重金招聘Python工程师标准>>> ...

    一、开发图片上传组件

    组件具体内容,如图所示,顺便问一下,我如何在简书里面粘贴代码,按照网上说的方法更改富文本编辑,没有成功,估计编辑器发生变化了。

    注意:imgUrl就是我们获取的图片地址

    二、页面运用

    三、页面效果

     

    由于后台接口我们用的是阿里云的OSS服务,所以,代码就不贴了。感谢大家的收看。

    忘了一个更重要的事情,那就是图片压缩的代码,把以下代码单独写在一个文件里,然后运用的时候调用即可。

    ```

    /**

    * 获得base64

    * @param {Object} obj

    * @param {Number} [obj.width] 图片需要压缩的宽度,高度会跟随调整

    * @param {Number} [obj.quality=0.8] 压缩质量,不压缩为1

    * @param {Function} [obj.before(this, blob, file)] 处理前函数,this指向的是input:file

    * @param {Function} obj.success(obj) 处理后函数

    * @example

    *

    */

    $.fn.localResizeIMG= function(obj) {

    this.on('change',function() {

    varfile= this.files[0];

    varURL=URL||webkitURL;

    varblob=URL.createObjectURL(file);

    // 执行前函数

    if($.isFunction(obj.before)) {obj.before(this, blob, file) };

    _create(blob, file);

    this.value='';// 清空临时数据

    });

    /**

    * 生成base64

    * @param blob 通过file获得的二进制

    */

    function_create(blob) {

    varimg= newImage();

    img.src=blob;

    img.οnlοad= function() {

    var_this= this;

    //生成比例

    varw=_this.width,

    h=_this.width,

    scale=w/h;

    w=obj.width||w;

    h=w/scale;

    //生成canvas

    varcanvas=document.createElement('canvas');

    varctx=canvas.getContext('2d');

    $(canvas).attr({width:w, height:h});

    ctx.drawImage(_this,0,0, w, h);

    /**

    * 生成base64

    * 兼容修复移动设备需要引入mobileBUGFix.js

    */

    varbase64=canvas.toDataURL('image/jpeg',obj.quality||0.8);

    // 修复IOS

    if( navigator.userAgent.match(/iphone/i) ) {

    varmpImg= newMegaPixImage(img);

    mpImg.render(canvas, { maxWidth:w, maxHeight:h, quality:obj.quality||0.8, orientation:6});

    base64=canvas.toDataURL('image/jpeg',obj.quality||0.8);

    }

    // 修复android

    if( navigator.userAgent.match(/Android/i) ) {

    varencoder= newJPEGEncoder();

    base64=encoder.encode(ctx.getImageData(0,0,w,h),obj.quality*100||80);

    }

    // 生成结果

    varresult={

    blob:blob,

    base64:base64,

    clearBase64:base64.substr( base64.indexOf(',')+1)

    };

    // 执行后函数

    obj.success(result);

    };

    }

    };

     

    /* 使用方法

    $('input:file').localResizeIMG({

    width: 100,

    quality: 0.1,

    //before: function (_this, blob) {},

    success: function (result) {

    var img = new Image();

    img.src = result.base64;

    $('body').append(img);

    console.log(result);

    }

    });

    */

    ```

     

    转载于:https://my.oschina.net/u/3371661/blog/3000495

    展开全文
  • 2019独角兽企业重金招聘Python工程师标准>>> ...

        分享一款自己封装的微信公众号上使用微信API多图片上传的组件【此组件已用于***公众号发帖回帖等等业务】,支持(bbs发帖)输入框任意位置上传,【***俱乐部】公众号发帖回帖功能

    核心组件代码:

    1.jqwximgupload.js

    /*
     * @autor:Aaron  email:haotking@163.com
     * @date:2016-11-05
     * @version:1.1.2
     * 微信多图片浏览选择图片上传插件
     * 插件依赖jquery和微信js-sdk:jweixin-1.0.0.js
     * 
     * 	<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
     * 	<script type="text/javascript" src="*************jquery.min.js" ></script>
     * 
     * window.jqwx.wxconfigure($id, options)
     * $id:点击后弹出图片选择框的html标签的id
     * options:扩展对象,
     * 
     * 用法:
     * window.jqwx.wxconfigure("uploadButton11",{
     *		signObject:signObject,
     *		jsApiList:['chooseImage','previewImage','uploadImage'] ,
     *		wxdownloadurl:url,
     *		isInitWx:false,
     *     wxsigniniturl:"/ump/page/bbsindex/wxJsAuth",
     *		onBefore:function(){
     *		},
     *		onSuccess:function(data,localIds){
     *			//图片下载成功后需要完成的事情
     *		},
     *		onComplete: function(){
     *			//弹窗关闭的回调,返回触发事件
     *		}
     *	});
     * 说明:
     * wxsigniniturl:本地服务器获取signObject的接口url 
     * signObject中对象对应微信js-sdk初始化微信sdk时签名对象
     * signObject:{
     *		appid:"",           微信公众号appid   *必须
     *		timestamp:"",   签名的时间戳          *必须
     *		noncestr:"",      签名的字符串          *必须
     *		signature:""      签名                        *必须
     *	}
     * jsApiList:为需要用到的微信的js-sdk的接口,默认['chooseImage','previewImage','uploadImage']  *非必须
     * wxdownloadurl:选择图片后,图片会自动上传到微信服务器;需要提供企业服务器从微信下载图片的接口的url
     *                         插件会通过ajax将data: {serverIds:serverIds},作为json格式上传到服务器,serverIds为存储
     *                         在微信服务器上的所有图片的媒体ID,通过","分割开.  *必须
     * onBefore:点击传按钮后,先执行的事件; 例如:在图片上传完成之前,禁止用户做其他的一些点击操作       *非必须
     * onSuccess:function(data,localIds){}图片上传成功后,由wxdownloadurl对应接口返回来的data数据,将data数据进行一些页面的处理,比如显示上传成功的图片
     * 														   localIds对应的是微信选择的所有本地图片对应的id通过","分割开的字符串  
     * onComplete:上传插件已经调用完成,最后进行的操作
     * isInitWx:是否要执行微信Js-sdk的初始化,一个页面只执行一次
     */
    (function($,wx){
    	window['jqwx'] = window['jqwx'] || {};
    	window['jqwx'].isWeixinInitComplete=(window['jqwx'].isWeixinInitComplete)||false;
    	initsign=function initsign(url){
    		var  signObject;
    		var curr_url=location.href.split('#')[0];
    		$.ajax({
    			url : url,
    			type : "Post",
    			async:false,
    			data : {
    				'url':curr_url 
    			},
    			error : function(msg) {
    				alert("微信接口加载失败,请重新进入!"+msg);
    			},
    			success : function(data) {
    				signObject=data;
    			}
    		}); 
    		return signObject;
    	}
    	window.jqwx.insertImage =function(contentId,src) {
    	    document.getElementById(contentId).focus(); 
    		var selection = window.getSelection ? window.getSelection() : document.selection;
    		var range = selection.createRange ? selection.createRange() : selection.getRangeAt(0);
    		if (!window.getSelection) {
    		    range.pasteHTML(src);
    		    range.collapse(false);
    		    range.select();
    		} else {
    		    range.collapse(false);
    		    var hasR = range.createContextualFragment(src);
    		    var hasLastChild = hasR.lastChild;
    		    while (hasLastChild && hasLastChild.nodeName.toLowerCase() == "br" && hasLastChild.previousSibling && hasLastChild.previousSibling.nodeName.toLowerCase() == "br") {
    		        var e = hasLastChild;
    		        hasLastChild = hasLastChild.previousSibling;
    		        hasR.removeChild(e);
    		    }
    		    //range.insertNode(range.createContextualFragment("<p><br></p>"));
    		    range.insertNode(hasR);
    		    if (hasLastChild) {
    		        range.setEndAfter(hasLastChild);
    		        range.setStartAfter(hasLastChild);
    		    }
    		    selection.removeAllRanges();
    		    selection.addRange(range);
    		}
    	}
    	window.jqwx.addRange=function (o){
    	   var event = window.event || arguments.callee.caller.arguments[0];
    	    //target 就是这个对象
    	   var  target = event.srcElement||event.target;
    	   var sel, range;
    	   //var content = $("#"+o)[0].innerHTML;
    	   // $("#bbsContent_div")[0].innerHTML=content+"</br><p>&nbsp;</p>";
    	     document.getElementById(o).focus(); 
    	      if (window.getSelection) {
        	  	    range = document.createRange();  
        	  	    sel = window.getSelection();
    	       	 //if (sel.getRangeAt && sel.rangeCount) {
    	       		  	//range.selectNodeContents(target);  
    	       		  	//range.collapse(true);  
    	                //range = sel.getRangeAt(0);
    	                //range.deleteContents();
    	               // range = range.cloneRange();
                    range.setStartAfter(target);
                    range.collapse(true);
                    document.getElementById(o).focus(); 
                    sel = window.getSelection();
                    sel.removeAllRanges();
                    sel.addRange(range);
    	          // }
    	       }  else if (document.selection && document.selection.type != "Control") {
    	            alert('浏览器不支持');
    	             // IE < 9
    	             //document.selection.createRange().pasteHTML(html);
    	       } 
    	}
    	window.jqwx.wxconfigure= function($id, options) {
    	    // 微信服务器返回图片ID数组
    	    var localIds = null;
    	    // 上传序号
    	    var idx = 0;
    	    var serverIds='';
    		var config = $.extend({
    			//属性
    			signObject:{
    				appid:"",
    				timestamp:"",
    				noncestr:"",
    				signature:""
    			},
    			size:9,
    			isInitWx:false,//是否执行微信js-sdk的初始化
    			jsApiList:[],//用于保存需要微信初始化的接口
    			isInitSign:true,
    			wxdownloadurl:"",
    			wxsigniniturl:"",
    			debug:false,
    			//事件
    			initwinsign: initsign,
    			onWxready:$.noop,
    			onBefore: $.noop,//点击确定的按钮回调
    			//onCancel: $.noop,//点击取消的按钮回调
    			onSuccess: $.noop,//图片下载成功后需要完成的事情
    			onComplete: $.noop//弹窗关闭的回调,返回触发事件
    		}, options);
    		
    		init();
    		
    		function hiddenButton(){
    			wx.hideMenuItems({
    		        menuList: [
    		        'menuItem:openWithSafari',    //在Safari中打开
    		        'menuItem:openWithQQBrowser',    //在QQ浏览器中打开
    		        'menuItem:copyUrl'    //复制链接
    		        ] 
    		    });
    		}
    		
    		function init(){
    			if((!jqwx.isWeixinInitComplete)&&config.isInitWx){
    				if(config.isInitSign){
    					var  currSignObject;
    					if(config.wxsigniniturl!=""){
    						currSignObject=config.initwinsign(config.wxsigniniturl);
    					}else{
    						currSignObject=config.initwinsign();
    					}
    					config.signObject=currSignObject;
    				}
    				wx.config({
    					   debug: config.debug, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    					   appId:config.signObject.appid, // 必填,公众号的唯一标识
    					   timestamp:config.signObject.timestamp, // 必填,生成签名的时间戳
    					   nonceStr: config.signObject.noncestr, // 必填,生成签名的随机串
    					   signature:config.signObject.signature,// 必填,签名,见附录1
    					   jsApiList:config.jsApiList // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
    					});
    					wx.ready(function(){
    						    //设置微信js-sdk初始化已完成
    							jqwx.isWeixinInitComplete=true;
    							hiddenButton();
    							config.onWxready();
    						    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
    					});
    					wx.error(function(res){
    						    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
    					});
    			}
    			$("#"+$id).click(onChooseClick);
    		}
    		
    		function onChooseClick(){
    			//将参数置为初始化状态
    		    localIds = null;
    		    idx = 0;
    		    serverIds='';
    			if(jqwx.isWeixinInitComplete){
    				
    				wx.chooseImage({
    				    count: config.size, // 默认9
    				    sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
    				    sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
    				    success: function (res) {
    				        var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
    						localIds = res.localIds;//本地图片id数组,下标从0开始
    			            //调用上传递归函数
    						if(config.wxdownloadurl!=""){
    							//禁用掉图片按钮和发布按钮
    							$("#"+$id).attr({"disabled":"disabled"});
    							config.onBefore();
    							wxUploadImg(localIds);
    							//$("#"+$id).removeAttr("disabled");//将按钮可用
    			                //config.onComplete();
    						}else{
    							alert("请检查服务器微信图片下载url是否填写正确");
    						}
    				    }
    				});
    				
    			}else{
    				alert('微信接口正在初始化,请稍后重试!');
    			}
    		}
    	    function wxUploadImg(localIds){
    	        wx.uploadImage({//获取图片媒体ID
    	            localId: localIds[idx].toString(),  // 需要上传的图片的本地ID
    	            isShowProgressTips: 0, // 默认为1,显示进度提示
    	            success: function (res) {//获取成功
    	                // 上传序号,上传一张 累计 +1    
    	                idx++
    	                //存储图片媒体ID,用","号分割
    	                serverIds+=res.serverId+',';
    	                if(idx<localIds.length){//本地图片ID 还没全部获取完图片媒体ID
    	                     //调用上传递归函数
    	                    wxUploadImg(localIds);
    	                }else{
    	                    //上传序号归零
    	                    idx=0;
    	                    //服务器csrf 验证字符串,如果后端框架没开启csrf,则不需要
    	                    //var csrf=$('meta[name="csrf-token"]').attr('content');
    	                    var  sId=serverIds;
    	                    $.ajax({
    	                        url: config.wxdownloadurl,//服务器端根据图片媒体ID下载图片处理操作地址
    	                        type: 'POST',
    	                    	async:false,
    	                        dataType: 'json',
    	                        data: {serverIds:serverIds},
    	                    }).done(function(data) {
    	                        alert("上传成功");
    	                        config.onSuccess(data,localIds,sId);
    	                    }).fail(function() {
    	                        //console.log("error");
    	                    }).always(function() {
    	                        //console.log("complete");
    	                          $("#"+$id).removeAttr("disabled");//将按钮可用
    	                          config.onComplete();
    	                    });
    	                    serverIds='';
    	                    return true;
    	                }
    	            },
    	            fail: function(res){//获取多媒体id失败 返回错误代码
    	                alert("上传失败,msg:"+JSON.stringify(res));
    	                $("#"+$id).removeAttr("disabled");//将按钮可用
    	                config.onComplete();
    	            }
    	        });
    	    }
    	};
    })(jQuery,wx);
    
    

    2.jqking.main.js(可用于pc端图片任意位置插入jq.addRange、jq.insertImage方法)

    (function(jqr_obj) {
    		var jquery = jqr_obj;
    		//注册命名空间jKing到window对象上  
    		window['jKing'] = {};
    		//定义一个jKing函数  
    		var version = "1.0.0";
    		jq = function(selector) {
    			// The jKing object is actually just the init constructor 'enhanced'
    			// Need init if jKing is called (just allow error to be thrown if not included)
    
    			return new jq.fn.init(selector);
    		};
    		//动态属性方法
    		jq.fn = jq.prototype = {
    			// The current version of jKing being used
    			jKing : version,
    			constructor : jq,
    			// Start with an empty selector
    			selector : "",
    			// The default length of a jKing object is 0
    			length : 0,
    			get : function() {
    				if (typeof this.selector === "string"
    						&& this.selector.length > 0) {
    					if (this.selector.startWith("#")) {
    						this.element = document.getElementById(this.selector);
    						return this;
    					} else if (this.selector.startWith(".")) {
    						var odiv = document.getElementsByTagName("*");
    
    						var a = [];
    						for ( var i = 0; i < odiv.length; i++) {
    							if (this.selector == "." + odiv[i].className) {
    								a[a.length] = odiv[i];
    							}
    						}
    						this.element = a;
    						return this;
    					}
    				}
    			}
    
    		};
    
    		//定义静态支持扩展方法
    		jq.extend = function(namespace, _o1) {
    			if (!arguments[1]) {
    				// 开始遍历   
    				for ( var p in arguments[0]) {
    					// 方法  
    					//console.info(_o1);
    					//console.info(p);
    					if (typeof (arguments[0][p]) == "function") {
    						jq[p] = arguments[0][p];
    					}
    				}
    			} else {
    				if (namespace && typeof (namespace) === "object") {
    					// 开始遍历   
    					for ( var p in arguments[1]) {
    						// 方法  
    						//console.info(_o1);
    						//console.info(p);
    						if (typeof (arguments[1][p]) == "function") {
    							namespace[p] = arguments[1][p];
    						}
    					}
    				}
    			}
    
    		};
    		jq.extend({//内部使用的方法
    			"nspace" : function(arr, _obj, i) {
    				if (i <= arr.length - 1) {
    					var obj;
    					if (typeof (_obj[arr[i]]) == "undefined") {
    						obj = _obj[arr[i]] = {};
    					} else if (_obj[arr[i]]
    							&& typeof (_obj[arr[i]]) == "object") {
    						obj = _obj[arr[i]];
    					}
    					//alert(i);
    					//_obj[arr[i]].b="1";
    					jq.nspace(arr, obj, i + 1);
    				} else {
    					//alert(arr.toString());
    					//alert(jq.json2str());
    					return;
    				}
    			}
    		});
    		jq.ns = function(namespace) {
    			var nsArray = new Array();
    			if (namespace && typeof (namespace) === "string") {
    				nsArray = namespace.split(".");
    				if (nsArray && nsArray.length > 0) {
    					jq.nspace(nsArray, jq, 1);
    				}
    			} else {
    				alert("命名空间必须是非空字符串!");
    				return;
    			}
    		}
    		init = jq.fn.init = function(selector) {
    			if (!selector) {
    				return this;
    			}
    			if (typeof selector === "string" && selector.length > 0) {
    				this.selector = selector;
    				this.length = selector.length;
    				return this;
    			}
    		};
    
    		init.prototype = jq.fn;
    		//动态的load module
    		jKing.load = function(_o1) {
    			for ( var p in _o1) {
    				if (typeof (_o1[p]) == "function") {
    					window['jKing'][p] = _o1[p];
    				}
    			}
    		};
    
    		/* 
    		 * addEventListener:监听Dom元素的事件 
    		 *   
    		 *  target:监听对象 
    		 *  type:监听函数类型,如click,mouseover 
    		 *  func:监听函数 
    		 */
    		jq.extend({
    			"addEventHandler" : function(target, type, callback) {
    				if (target.addEventListener) {
    					//监听IE9,谷歌和火狐  
    					target.addEventListener(type, callback, false);
    				} else if (target.attachEvent) {
    					target.attachEvent("on" + type, callback);
    				} else {
    					target["on" + type] = callback;
    				}
    			}
    		});
    		/* 
    		 * removeEventHandler:移除Dom元素的事件 
    		 *   
    		 *  target:监听对象 
    		 *  type:监听函数类型,如click,mouseover 
    		 *  func:监听函数 
    		 */
    		jq.extend({
    			"removeEventHandler" : function(target, type, callback) {
    				if (target.removeEventListener) {
    					//监听IE9,谷歌和火狐  
    					target.removeEventListener(type, callback, false);
    				} else if (target.detachEvent) {
    					target.detachEvent("on" + type, callback);
    				} else {
    					delete target["on" + type];
    				}
    			}
    		});
    		String.prototype.startWith = function(compareStr) {
    			return this.indexOf(compareStr) == 0;
    		}
    		/*停止冒事件*/
    		jq.stopEvent = function(event) {
    			var e = event || window.event;
    			if (e && e.stopPropagation) {
    				e.stopPropagation();
    			} else {
    				e.cancelBubble = true;
    			}
    		};
    		//Json对象转字符串的方法
    		jq.json2str = function(obj) {
    			var s = [];
    			for ( var i in obj) {
    				obj[i] = typeof obj[i] == 'string' ? '"' + obj[i] + '"'
    						: (typeof obj[i] == 'object' ? jq.json2str(obj[i])
    								: obj[i]);
    				s.push(i + ':' + obj[i]);
    			}
    			return '{' + s.join(',') + '}';
    		}
    		//将对象转换成字符串的方法
    		jq.objConvertStr = function(o) {
    			if (o == undefined) {
    				return "";
    			}
    			var r = [];
    			if (typeof o == "string")
    				return "\""
    						+ o.replace(/([\"\\])/g, "\\$1")
    								.replace(/(\n)/g, "\\n")
    								.replace(/(\r)/g, "\\r")
    								.replace(/(\t)/g, "\\t") + "\"";
    			if (typeof o == "object") {
    				if (!o.sort) {
    					for ( var i in o)
    						r.push("\"" + i + "\":" + jq.objConvertStr(o[i]));
    					if (!!document.all
    							&& !/^\n?function\s*toString\(\)\s*\{\n?\s*\[native code\]\n?\s*\}\n?\s*$/
    									.test(o.toString)) {
    						r.push("toString:" + o.toString.toString());
    					}
    					r = "{" + r.join() + "}"
    				} else {
    					for ( var i = 0; i < o.length; i++)
    						r.push(jq.objConvertStr(o[i]))
    					r = "[" + r.join() + "]";
    				}
    				return r;
    			}
    			return o.toString().replace(/\"\:/g, '":""');
    		}
    		//将from表单序列化
    		jq.serializeObject = function(formId) {
    			var form = $("#" + formId);
    			var o = {};
    			$.each(form.serializeArray(), function(index) {
    				if (o[this['name']]) {
    					o[this['name']] = o[this['name']] + "," + this['value'];
    				} else {
    					o[this['name']] = this['value'];
    				}
    			});
    			return o;
    		};
    		//将对象填入到表单中
    		jq.objectToForm = function setValue(obj, formId) {
    			// 开始遍历   
    			for ( var p in obj) {
    				// 方法  
    				if (typeof (obj[p]) == "function") {
    					obj[p]();
    				} else {
    					//console.log(document.getElementById("aa").getAttribute("field"));
    					//console.log($("#aa").attr("value"));
    					//console.log($("#admin_user_searchForm > #aa").get());
    					var field = $("#" + formId + " > #field_" + p);
    					if (field && field.attr("field")) {
    						field.val(obj[p]);
    					}
    					//p 为属性名称,obj[p]为对应属性的值     
    				}
    			}
    
    		};
    		
    		jq.insertImage =function(contentId,src) {
    		    document.getElementById(contentId).focus(); 
    			var selection = window.getSelection ? window.getSelection() : document.selection;
    			var range = selection.createRange ? selection.createRange() : selection.getRangeAt(0);
    			if (!window.getSelection) {
    			    range.pasteHTML(src);
    			    range.collapse(false);
    			    range.select();
    			} else {
    			    range.collapse(false);
    			    var hasR = range.createContextualFragment(src);
    			    var hasLastChild = hasR.lastChild;
    			    while (hasLastChild && hasLastChild.nodeName.toLowerCase() == "br" && hasLastChild.previousSibling && hasLastChild.previousSibling.nodeName.toLowerCase() == "br") {
    			        var e = hasLastChild;
    			        hasLastChild = hasLastChild.previousSibling;
    			        hasR.removeChild(e);
    			    }
    			    //range.insertNode(range.createContextualFragment("<p><br></p>"));
    			    range.insertNode(hasR);
    			    if (hasLastChild) {
    			        range.setEndAfter(hasLastChild);
    			        range.setStartAfter(hasLastChild);
    			    }
    			    selection.removeAllRanges();
    			    selection.addRange(range);
    			}
    		}
    		jq.addRange=function (o){
    		   var event = window.event || arguments.callee.caller.arguments[0];
    		    //target 就是这个对象
    		   var  target = event.srcElement||event.target;
    		   var sel, range;
    		   //var content = $("#"+o)[0].innerHTML;
    		   // $("#bbsContent_div")[0].innerHTML=content+"</br><p>&nbsp;</p>";
    		     document.getElementById(o).focus(); 
    		      if (window.getSelection) {
    			  	    range = document.createRange();  
    			  	    sel = window.getSelection();
    		       	 //if (sel.getRangeAt && sel.rangeCount) {
    		       		  	//range.selectNodeContents(target);  
    		       		  	//range.collapse(true);  
    		                //range = sel.getRangeAt(0);
    		                //range.deleteContents();
    		               // range = range.cloneRange();
    		            range.setStartAfter(target);
    		            range.collapse(true);
    		            document.getElementById(o).focus(); 
    		            sel = window.getSelection();
    		            sel.removeAllRanges();
    		            sel.addRange(range);
    		          // }
    		       }  else if (document.selection && document.selection.type != "Control") {
    		            alert('浏览器不支持');
    		             // IE < 9
    		             //document.selection.createRange().pasteHTML(html);
    		       } 
    		}
    		//把jq函数注册到jKing命名空间中  
    		window['jKing']['$'] = jq;
    		window['jKing']['jq'] = jquery;
    		//window['jKing']['load']=jKing.load;
    	})(jQuery);

     

    效果图如下:

    fe3befc862bdab27ef5f6558d19177bc738.jpg

    2125d18513021cfef3f79a9afb7c3bfa67c.jpg

    4b8a0f940ef88eb02ee68061f9502b9c3f1.jpg

    d8406bf7f683a7f1a1a257bc54bccb02bc6.jpg2fb9c9188eb07ab079973eb63f875c0e8b9.jpg

    转载于:https://my.oschina.net/u/2371923/blog/1837930

    展开全文
  • 所以这篇文章主要描述了使用AppInventor平台搭建一个拍照上传到云端的场景,使用Web客户端组件,将图片PUT到阿里云后端,并基于flask框架,用一段非常简单的python脚本实现上传图片的保存。


    网上AppInventor与阿里云后端交互的实例比较少,所以这篇文章主要描述了使用AppInventor平台搭建一个拍照上传到云端的场景,使用Web客户端组件,将图片PUT到阿里云后端,并基于flask框架,用一段非常简单的python脚本实现上传图片的保存。
    本教程的AppInventor所用服务器是http://app.gzjkw.net/
    云是购买的阿里云(其他云应该也可以),linux系统,自带python2.7环境,所用的主要库为flask,以及flask_restful
    本教程比较适合稍微懂些AppInventor开发平台的人士(入门很快),以及需要快速搭建APP实现图片保存在云端以待处理(图像识别等)的应用场景。

    AppInventor端组件与代码

    本教程的AppInventor所用服务器是http://app.gzjkw.net/
    这是一个简单的在线图形化编程环境,上手非常迅速,本教程跳过基础入门,直接讲核心功能搭建。

    组件设计

    APP组件设计
    组件我比较偷懒,就只拖了一个按钮进来,当点击这个按钮的时候,就会调用照相机;相机完成拍照后就会自动上传。

    逻辑设计

    APP逻辑设计
    这边的备注请仔细看一下,对于网络通信我并不精通,只能简单地解释一下,如果不专业请见谅。在本项目中,我们使用的是HTTP通信协议。AppInventor里的Web客户端组件提供了许多HTTP方法的接口,因为上传的是图片所以我采用了PUT方法(方法内容各位可以自行百度)。
    url网址的设置为“http://***.***.***.***:端口号/路径”,前面的星号为你自己购得的阿里云ip地址,端口号在python程序中自己设置,路径也在后面的程序中进行设置。这里的通信方法主要是socket通信连接,如果只为实现功能可以不用理解具体原理。

    Python云端API搭建

    环境搭建

    云:我购买是阿里云学生版轻量应用服务器,其他云平台应该都可以。
    镜像信息:Centos7.3
    python版本:2.7.5
    python库:Flask (1.0.3)、Flask-RESTful (0.3.7)
    阿里云操作软件:Xshell,Xftp
    本教程相当于在阿里云上开了一个简单的API,没有涉及到后端程序的编写。如果需要实现图片的一些额外操作(比如保存上来的图片进行图像识别等),可以把后端代码import进来并加以调用。

    大家新买的云服务器,记得把安全组设置为所有端口都能用。有些服务器会默认只开两个端口,如果没设置的话你的APP消息传过去会被防火墙挡住

    python代码

    from flask_restful import Api, Resource
    from flask import Flask, request
    
    app = Flask(__name__)
    api = Api(app)
    
    # 这边的类名是自己定义的
    class receive_pic(Resource):
        def put(self):
            #接收二进制流保存为图片
            img = request.get_data()
            with open("test.png", "wb") as f:
                f.write(img)
            return 0
            
    # 后面的路径可以自己定义
    api.add_resource(receive_pic,'/test')
    
    if __name__ == '__main__':
        app_port = 8081
        app.run(host="0.0.0.0", port=app_port, debug=True)
    

    API云端启动

    需要先把代码存放在阿里云上。然后通过以下指令进行操作,开启API
    阿里云linux启动指令
    这样图片就保存在阿里云上了
    在这里插入图片描述
    因为用xshell操作断开后,后端程序也会自动断开,默认常开启的指令为:nohup python api.py &
    终止默认常开启:
    lsof -i:8081(用哪个端口输入哪个端口)
    kill -9 pid(PID号输入上面指令跳出的内容)

    展开全文
  • 2019独角兽企业重金招聘Python工程师标准>>> ...

    题目描述

    请按要求书写一个图片上传的弹窗组件,弹窗的样式要求如下:

    1、样式要求

    (1)宽: 668px,  高: 608px, 圆角5px, 边框1px solid #ccc

    (2)弹窗垂直居中, 左右居中

    (3)标题栏高 :50px ,   右边的x不能使用图片,请使用css3画出, 标题文字颜色:红色

    (4)列表元素的高:110px , 宽:110px, 边框 1px solid #ccc

    (5)中间“添加”按钮的图片地址:https://p1.pstatp.com/large/3ecd0004b6bdeff4c48d

        整体样式效果如下图所示:

    2、功能要求

    (1)点击“添加”按钮弹出文件选择框, 选择图片(要求只能选择png、jpeg、jpg三种图片)

    (2)选择图片后列表增加一张图片缩略图展示(此时图片未上传到服务器)

    (3)点击上传按钮将当前选择的图片上传到图片服务器(只要求上传当前选择的一张图片,如能实现多个同时上传更佳),上传的图片的接口地址: https://mp.toutiao.com/profile_v2/

    接口说明:接口只接收并且处理二进制文件。

    请编码实现。

    (注:不支持本地IDE)

    转载于:https://my.oschina.net/u/3759656/blog/2243795

    展开全文
  • 1.下载、安装AutoIt V3 下载官网:... 2.AutoIt V3组件介绍 AutoItWindowsInfo 或者Au3Info_x64.exe 用于帮助我们识别Windows控件信息。 CompileScriptto.exe 或者Aut2exe_x64.ex...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 整体流程如下: ...如果,你的前端和后台项目不是部署在一台服务器上或者部署在一台服务器上端口号不同的情况下,你需要考虑到跨域问题,python后台接口设置允许跨域的简单配置如下: 二、...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • Python基础教程

    2019-04-08 09:48:44
    Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等 众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、 Quora(中国知乎)、豆瓣...
  • 之前一直使用python的PIL自定义裁切图片,今天有需求需要做一个前端的选择预览页面,索性就把这个功能整理一下,分享给大家。...使用的django,主要实现2部分的功能,第一:图片上传,第二:图片裁切 ...
  • 之前一直使用python的PIL自定义裁切图片,今天有需求需要做一个前端的选择预览页面,索性就把这个功能整理一下,分享给大家。...使用的django,主要实现2部分的功能,第一:图片上传,第二:图片裁切
  • 04 Form组件上传文件 05 上传相关内容梳理 06 Model操作知识提问 07 Model操作概述 08 Model字段 09 Model连表字段参数详解 10 Model自定义多对多第三张表 11 强插一道面试题 12 Model连表操作梳理 13 多对多自关联 ...
  • jQuery-File-Upload 组件是一个非常好用的文件上传组件,有很多友好的特性: 支持文件多选 拖拽上传 上传进度条 取消上传 图片、音视频预览 纯JS和HTML5代码,不需额外安装插件 服务器端提供了三种部署方式: gae-...
  • Scrapy库不是一个简单的函数,而是一个爬虫框架。爬虫框架就是实现爬虫功能的一个软件结构和功能组件集合爬虫...[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wyuKncYV-1591115592471)(./
  • 原文 -> 阿里巴巴 MySQL binlog 增量订阅 & 消费组件 Canal 实践 https://blog.error.work/python/115.html ...[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vlKLXxgl
  • jQuery File Upload 是一个Jquery文件上传组件,支持多文件上传、取消、删除,上传前缩略图预览、列表显示图片大小,支持上传进度条显示;支持各种动态语言开发的服务器端。 官网链接:...
  • jQuery 文件上传组件,支持批量上传,拖放上传,显示上传进度条以及校验功能。 支持预览图片、音频和视频,支持跨域上传和客户端图片缩放,支持的服务端平台有:PHP, Python, Ruby on Rails, Java, Node.js, Go 等等...
  • 最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料;本资料仅用于学习。 【课程内容】 第1周 开课介绍 python发展介绍 第一个python程序 变量 字符编码与二进制 字符编码的区别与介绍 用户交互程序 if ...
  • jQuery File Upload 是一个 jQuery 图片上传组件,支持多文件上传、取消、删除,上传前缩略图预览、列表显示图片大小,支持上传进度条显示;支持各种动态语言开发的服务器端。 特征: 1、多文件上传: 允许一次选择...
  • Tips(碰到的主要问题...简要的业务过程:把Word文档(.doc,不是.docx)上传至服务器(用IIS+Django+wfastcgi部署),并读取文档中的内容与图片信息。 即这个过程中需要把doc文档另存为docx的格式,然后再去读取...
  • Django的Ajax实现之文件上传

    千次阅读 2015-05-25 17:44:37
    Uploadify组件上传文件很酷,可以实现文件进度上传,而且可以批量上传各种文件。...这次只说上传图片部分,至于上传文件,其实可以照猫画虎,而且来得会简单些,只是python程序后端写法的区别而已,前端代码Uplo
  • Django的AJAX实现之文件上传

    千次阅读 2013-12-27 16:49:56
    Uploadify组件上传文件很酷,可以实现文件进度上传,而且可以批量上传各种文件。...这次只说上传图片部分,至于上传文件,其实可以照猫画虎,而且来得会简单些,只是python程序后端写法的区别而已,前端代码Uplo
  • 最近做的一个项目很多批量上传图片和文件的需求,产品说需要写一个带进度条动画的批量上传文件的组件,结果他们后端(python)跟我说不能多文件上传,我一听就很尴尬了,怎么可能不能多文件呢哈哈,后来我只是告诉他...

空空如也

空空如也

1 2 3
收藏数 49
精华内容 19
关键字:

python图片上传组件

python 订阅