23
2016
01

as3提交表单

表单提交,如html中的<form></form>,as3中并没有类似的功能,在as3中我们一般都是用URLLoader来提交数据,如果要提交图片等大文件,一般会用post,指定URLRequest对象的data属性为图片的ByteArray,可能还需要指定contentType。

关于as3如何实现图片上传,这里不多介绍,感兴趣可以从这里下载源码:http://hanyeah.com/blog/post/%E5%9B%BE%E7%89%87%E4%B8%8A%E4%BC%A0.html

如果我们提交的数据时许多的键值对,as3中,我们可以采用get方式,也可以使用post方式,指定URLRequest对象的data属性为URLVariables对象。

如果我们要以二进制方式提交一张图片,并附加一些键值对信息,该怎么实现呢?当然我们可以以post方式提交图片数据,使用get方式提交“键值对信息”(直接把“键值对信息”放在请求地址中)。作者最早遇到这个问题是,就是这么做的。

如果我们要一次提交多张图片,该怎么实现呢?

当然,类似的问题,我们都可以通过定义自己的协议来实现,但是前提是后台技术人员愿意和你制订协议,以及写好协议文档。

其实类似的协议是存在的,html中我们可以使用<form>表单来一次性提交键值对信息和文件数据。通过 Content-Type: multipart/form-data。

form实现比较简单,如下。


as3中就不那么容易了。好在有大神自己写了一个类(UploadPostHelper)来实现表单的提交(要获得该类,可以下载文章最后的附件或自行百度)。

测试过程中,对UploadPostHelper进行了修改,自己封装了一个类。

建议使用FormsRequest.as。源码如下:

/* 
	原作者:Jonathan Marston
	修改:hanyeah
	修改时间:2016/1/23 14:51
*/
package com.hanyeah
{
	
	/**
	 * Take a fileName, byteArray, and parameters object as input and return ByteArray post data suitable for a UrlRequest as output
	 *
	 * @see http://marstonstudio.com/?p=36
	 * @see http://www.w3.org/TR/html4/interact/forms.html
	 * @see http://www.jooce.com/blog/?p=143
	 * @see http://www.jooce.com/blog/wp%2Dcontent/uploads/2007/06/uploadFile.txt
	 * @see http://blog.je2050.de/2006/05/01/save-bytearray-to-file-with-php/
	 *
	 * @author Jonathan Marston
	 * @version 2007.08.19
	 *
	 * This work is licensed under a Creative Commons Attribution NonCommercial ShareAlike 3.0 License.
	 * @see http://creativecommons.org/licenses/by-nc-sa/3.0/
	 *
	 */

	
	import flash.net.URLRequest;
	import flash.net.URLRequestMethod;
	import flash.utils.ByteArray;
	import flash.utils.Endian;
	/**
	 * 
	 */
	public class FormsRequest {
		/**
		 * Boundary used to break up different parts of the http POST body
		 */
		private var _boundary:String;
		private var postData:ByteArray;
		private var bytes:String;
		private var req:URLRequest;
		private var _url:String;
		//--------------------------------------
		//  PUBLIC METHODS
		//--------------------------------------
		public function FormsRequest(url:String = "") {
			_url = url;
			reset();
		}
		
		/**
		 * 待提交的地址。
		 */
		public function get url():String 
		{
			return _url;
		}
		/**
		 * 待提交的地址。任意时刻设置此属性均有效。
		 */
		public function set url(value:String):void 
		{
			_url = value;
			req.url = value;
		}
		/**
		 * 重置。
		 */
		public function reset():void {
			postData = new ByteArray();
			postData.endian = Endian.BIG_ENDIAN;
			_boundary = "";
			req = new URLRequest(_url);
			req.method = URLRequestMethod.POST;
			req.contentType="multipart/form-data;boundary="+getBoundary();
		}
		/**
		 * 添加键值对数据表单
		 * @param	parameters
		 */
		public function addParameters(parameters:Object) {
			//add parameters to postData
			for(var name:String in parameters) {
				postData = BOUNDARY(postData);
				postData = LINEBREAK(postData);
				bytes = 'Content-Disposition: form-data; name="' + name + '"';
				for ( var i:int = 0; i < bytes.length; i++ ) {
					postData.writeByte( bytes.charCodeAt(i) );
				}
				postData = LINEBREAK(postData);
				postData = LINEBREAK(postData);
				postData.writeUTFBytes(parameters[name]);
				postData = LINEBREAK(postData);
			}
		}
		/**
		 * 添加上传文件
		 * @param	byteArray
		 * @param	fileDataName	服务器端用于获取该文件数据的字段名
		 * @param	fileName		文件名
		 */
		public function addFiledata(byteArray:ByteArray,fileDataName:String,fileName:String) {
			//add Filedata to postData
			
			var extention:String = fileName.substring(fileName.lastIndexOf(".") + 1);
			var contentType:String=getContentTypeByExtension(extention);
			
			postData = BOUNDARY(postData);
			postData = LINEBREAK(postData);
			bytes = 'Content-Disposition: form-data; name="'+fileDataName+'"; filename="';
			for ( var i:int = 0; i < bytes.length; i++ ) {
				postData.writeByte( bytes.charCodeAt(i) );
			}
			postData.writeUTFBytes(fileName);
			postData = QUOTATIONMARK(postData);
			postData = LINEBREAK(postData);
			bytes = 'Content-Type: '+contentType;
			for ( i = 0; i < bytes.length; i++ ) {
				postData.writeByte( bytes.charCodeAt(i) );
			}
			postData = LINEBREAK(postData);
			postData = LINEBREAK(postData);
			postData.writeBytes(byteArray, 0, byteArray.length);
			postData = LINEBREAK(postData);
		}
		/**
		 * 不知道有什么作用
		 */
		public function addUploadFiled():void {
			//add upload filed to postData
			postData = LINEBREAK(postData);
			postData = BOUNDARY(postData);
			postData = LINEBREAK(postData);
			bytes = 'Content-Disposition: form-data; name="Upload"';
			for ( var i:int = 0; i < bytes.length; i++ ) {
				postData.writeByte( bytes.charCodeAt(i) );
			}
			postData = LINEBREAK(postData);
			postData = LINEBREAK(postData);
			bytes = 'Submit Query';
			for ( i = 0; i < bytes.length; i++ ) {
				postData.writeByte( bytes.charCodeAt(i) );
			}
			postData = LINEBREAK(postData);
		}
		/**
		 * 结束并返回URLRequest对象
		 * @return
		 */
		public function closingBoundary():URLRequest {
			//closing boundary
			postData = BOUNDARY(postData);
			postData = DOUBLEDASH(postData);
			postData.position = 0;
			req.data = postData;
			return req;
		}
		
		//--------------------------------------
		/**
		 * Get the boundary for the post.
		 * Must be passed as part of the contentType of the UrlRequest
		 */
		private function getBoundary():String {
			if(_boundary.length == 0) {
				for (var i:int = 0; i < 0x20; i++ ) {
					_boundary += String.fromCharCode( int( 97 + Math.random() * 25 ) );
				}
			}
			return _boundary;
		}
		//
		private static var contentTypes:Object = { ".css":"text/css", ".rjt":"application/vnd.rn-realsystem-rjt", ".rjs":"application/vnd.rn-realsystem-rjs", ".ipa":"application/vnd.iphone", ".dib":"application/x-dib", ".rle":"application/x-rle", ".der":"application/x-x509-ca-cert", ".xap":"application/x-silverlight-app", ".doc":"application/msword", ".rmf":"application/vnd.adobe.rmf", ".rm":"application/vnd.rn-realmedia", ".xql":"text/xml", ".drw":"application/x-drw", ".rat":"application/rat-file", ".rmi":"audio/mid", ".dbf":"application/x-dbf", ".dwf":"application/x-dwf", ".rec":"application/vnd.rn-recording", ".rmm":"audio/x-pn-realaudio", ".htt":"text/webviewhtml", ".dbx":"application/x-dbx", ".dwg":"application/x-dwg", ".rms":"application/vnd.rn-realmedia-secure", ".rmp":"application/vnd.rn-rn_music_package", ".dcx":"application/x-dcx", ".dxf":"application/x-dxf", ".rmx":"application/vnd.rn-realsystem-rmx", ".rmvb":"application/vnd.rn-realmedia-vbr", ".dgn":"application/x-dgn", ".emf":"application/x-emf", ".rp":"image/vnd.rn-realpix", ".rnx":"application/vnd.rn-realplayer", ".dll":"application/x-msdownload", ".ent":"text/xml", ".rsml":"application/vnd.rn-rsml", ".rpm":"audio/x-pn-realaudio-plugin", ".dot":"application/msword", ".eps":"application/postscript", ".rmj":"application/vnd.rn-realsystem-rmj", ".rtf":"application/x-rtf", ".rt":"text/vnd.rn-realtext", ".dtd":"text/xml", ".etd":"application/x-ebx", ".rv":"video/vnd.rn-realvideo", ".sdp":"application/sdp", ".fax":"image/fax", ".sat":"application/x-sat", ".sam":"application/x-sam", ".dxb":"application/x-dxb", ".fif":"application/fractals", ".sdw":"application/x-sdw", ".edn":"application/vnd.adobe.edn", ".frm":"application/x-frm", ".slb":"application/x-slb", ".sit":"application/x-stuffit", ".eml":"message/rfc822", ".gbr":"application/x-gbr", ".slk":"drawing/x-slk", ".sld":"application/x-sld", ".epi":"application/x-epi", ".gif":"image/gif", ".smil":"application/smil", ".smi":"application/smil", ".sol":"text/plain", ".gp4":"application/x-gp4", ".snd":"audio/basic", ".smk":"application/x-smk", ".exe":"application/x-msdownload", ".hmr":"application/x-hmr", ".sor":"text/plain", ".fdf":"application/vnd.fdf", ".hpl":"application/x-hpl", ".spl":"application/futuresplash", ".gl2":"application/x-gl2", ".fo":"text/xml", ".hrf":"application/x-hrf", ".ssm":"application/streamingmedia", ".hgl":"application/x-hgl", ".g4":"application/x-g4", ".htc":"text/x-component", ".stl":"application/vnd.ms-pki.stl", ".hpg":"application/x-hpgl", ".svg":"text/xml", ".html":"text/html", ".sty":"application/x-sty", ".hqx":"application/mac-binhex40", ".tdf":"application/x-tdf", ".htx":"text/html", ".swf":"application/x-shockwave-flash", ".tga":"application/x-tga", ".ico":"application/x-ico", ".tg4":"application/x-tg4", ".icb":"application/x-icb", ".iff":"application/x-iff", ".tif":"application/x-tif", ".spc":"application/x-pkcs7-certificates", ".ig4":"application/x-g4", ".igs":"application/x-igs", ".tiff":"image/tiff", ".spp":"text/xml", ".iii":"application/x-iphone", ".img":"application/x-img", ".top":"drawing/x-top", ".sst":"application/vnd.ms-pki.certstore", ".ins":"application/x-internet-signup", ".isp":"application/x-internet-signup", ".tsd":"text/xml", ".stm":"text/html", ".IVF":"video/x-ivf", ".java":"java/*", ".uin":"application/x-icq", ".txt":"text/plain", ".jfif":"image/jpeg", ".jpe":"application/x-jpe", ".vcf":"text/x-vcard", ".uls":"text/iuls", ".vml":"text/xml", ".jpeg":"image/jpeg", ".vdx":"application/vnd.visio", ".vda":"application/x-vda", ".jpg":"image/jpeg", ".vpg":"application/x-vpeg005", ".js":"application/x-javascript", ".jsp":"text/html", ".vsd":"application/vnd.visio", ".tld":"text/xml", ".la1":"audio/x-liquid-file", ".lar":"application/x-laplayer-reg", ".vst":"application/x-vst", ".torrent":"application/x-bittorrent", ".latex":"application/x-latex", ".lavs":"audio/x-liquid-secure", ".vsw":"application/vnd.visio", ".lbm":"application/x-lbm", ".lmsff":"audio/x-la-lms", ".vtx":"application/vnd.visio", ".vsx":"application/vnd.visio", ".ls":"application/x-javascript", ".ltr":"application/x-ltr", ".wav":"audio/wav", ".vxml":"text/xml", ".m1v":"video/x-mpeg", ".m2v":"video/x-mpeg", ".wb1":"application/x-wb1", ".wax":"audio/x-ms-wax", ".m3u":"audio/mpegurl", ".m4e":"video/mpeg4", ".wb3":"application/x-wb3", ".wb2":"application/x-wb2", ".mac":"application/x-mac", ".man":"application/x-troff-man", ".wiz":"application/msword", ".vss":"application/vnd.visio", ".math":"text/xml", ".wks":"application/x-wks", ".wk4":"application/x-wk4", ".wk3":"application/x-wk3", ".wm":"video/x-ms-wm", ".wma":"audio/x-ms-wma", ".mdb":"application/x-mdb", ".wkq":"application/x-wkq", ".mht":"message/rfc822", ".wmf":"application/x-wmf", ".mfp":"application/x-shockwave-flash", ".mi":"application/x-mi", ".mid":"audio/mid", ".mhtml":"message/rfc822", ".wmd":"application/x-ms-wmd", ".midi":"audio/mid", ".mil":"application/x-mil", ".wmv":"video/x-ms-wmv", ".wml":"text/vnd.wap.wml", ".mml":"text/xml", ".mnd":"audio/x-musicnet-download", ".wmz":"application/x-ms-wmz", ".wbmp":"image/vnd.wap.wbmp", ".mns":"audio/x-musicnet-stream", ".mocha":"application/x-javascript", ".wpd":"application/x-wpd", ".wp6":"application/x-wp6", ".movie":"video/x-sgi-movie", ".mp1":"audio/mp1", ".wpl":"application/vnd.ms-wpl", ".wpg":"application/x-wpg", ".mp2":"audio/mp2", ".mp2v":"video/mpeg", ".wr1":"application/x-wr1", ".wq1":"application/x-wq1", ".mp3":"audio/mp3", ".mp4":"video/mpeg4", ".wrk":"application/x-wrk", ".wri":"application/x-wri", ".mpa":"video/x-mpg", ".mpd":"application/vnd.ms-project", ".ws2":"application/x-ws", ".ws":"application/x-ws", ".mpe":"video/x-mpeg", ".mpeg":"video/mpg", ".wsdl":"text/xml", ".wmx":"video/x-ms-wmx", ".mpg":"video/mpg", ".mpga":"audio/rn-mpeg", ".xdp":"application/vnd.adobe.xdp", ".":"application/x-", ".mpp":"application/vnd.ms-project", ".mps":"video/x-mpeg", ".xfd":"application/vnd.adobe.xfd", ".xdr":"text/xml", ".mpt":"application/vnd.ms-project", ".mpv":"video/mpg", ".xhtml":"text/html", ".xfdf":"application/vnd.adobe.xfdf", ".mpv2":"video/mpeg", ".mpw":"application/vnd.ms-project", ".xls":"application/vnd.ms-excel", ".mpx":"application/vnd.ms-project", ".mtx":"text/xml", ".xml":"text/xml", ".xlw":"application/x-xlw", ".mxp":"application/x-mmxp", ".net":"image/pnetvue", ".xq":"text/xml", ".wsc":"text/scriptlet", ".nrf":"application/x-nrf", ".nws":"message/rfc822", ".xquery":"text/xml", ".wvx":"video/x-ms-wvx", ".odc":"text/x-ms-odc", ".*":"application/octet-stream", ".xsl":"text/xml", ".xsd":"text/xml", ".p10":"application/pkcs10", "0.001":"application/x-001", ".out":"application/x-out", ".xslt":"text/xml", ".p7b":"application/x-pkcs7-certificates", ".p7c":"application/pkcs7-mime", ".p12":"application/x-pkcs12", ".x_b":"application/x-x_b", ".xwd":"application/x-xwd", ".p7r":"application/x-pkcs7-certreqresp", "0.323":"text/h323", ".sisx":"application/vnd.symbian.install", ".sis":"application/vnd.symbian.install", ".acp":"audio/x-mei-aac", "0.907":"drawing/907", ".p7m":"application/pkcs7-mime", ".x_t":"application/x-x_t", ".aif":"audio/aiff", ".pc5":"application/x-pc5", ".p7s":"application/pkcs7-signature", ".apk":"application/vnd.android.package-archive", ".aiff":"audio/aiff", ".pcl":"application/x-pcl", ".pci":"application/x-pci", ".xpl":"audio/scpls", ".asa":"text/asa", ".pdf":"application/pdf", ".pcx":"application/x-pcx", "0.301":"application/x-301", ".asp":"text/asp", ".pdx":"application/vnd.adobe.pdx", "0.906":"application/x-906", ".au":"audio/basic", ".pgl":"application/x-pgl", ".pfx":"application/x-pkcs12", ".a11":"application/x-a11", ".awf":"application/vnd.adobe.workflow", ".pko":"application/vnd.ms-pki.pko", ".pic":"application/x-pic", ".ai":"application/postscript", ".bmp":"application/x-bmp", ".plg":"text/html", ".pl":"application/x-perl", ".aifc":"audio/aiff", ".c4t":"application/x-c4t", ".plt":"application/x-plt", ".pls":"audio/scpls", ".anv":"application/x-anv", ".cal":"application/x-cals", ".png":"image/png", ".asf":"video/x-ms-asf", ".cdf":"application/x-netcdf", ".ppa":"application/vnd.ms-powerpoint", ".pot":"application/vnd.ms-powerpoint", ".asx":"video/x-ms-asf", ".cel":"application/x-cel", ".pps":"application/vnd.ms-powerpoint", ".ppm":"application/x-ppm", ".avi":"video/avi", ".cg4":"application/x-g4", ".ppt":"application/vnd.ms-powerpoint", ".biz":"text/xml", ".cit":"application/x-cit", ".prf":"application/pics-rules", ".pr":"application/x-pr", ".bot":"application/x-bot", ".cml":"text/xml", ".prt":"application/x-prt", ".prn":"application/x-prn", ".c90":"application/x-c90", ".cmx":"application/x-cmx", ".ps":"application/x-ps", ".cat":"application/vnd.ms-pki.seccat", ".crl":"application/pkix-crl", ".pwz":"application/vnd.ms-powerpoint", ".ptn":"application/x-ptn", ".cdr":"application/x-cdr", ".csi":"application/x-csi", ".ra":"audio/vnd.rn-realaudio", ".r3t":"text/vnd.rn-realtext3d", ".cer":"application/x-x509-ca-cert", ".cut":"application/x-cut", ".ras":"application/x-ras", ".ram":"audio/x-pn-realaudio", ".cgm":"application/x-cgm", ".dbm":"application/x-dbm", ".rdf":"text/xml", ".hta":"application/hta", ".class":"java/*", ".crt":"application/x-x509-ca-cert", ".red":"application/x-red", ".htm":"text/html", ".cmp":"application/x-cmp", ".rlc":"application/x-rlc", ".dcd":"text/xml", ".rgb":"application/x-rgb", ".cot":"application/x-cot" };
		//
		/**
		 * 根据扩展名获取ContentType
		 * @param	extention		如:".swf"
		 * @return	contentType		如:"application/x-shockwave-flash"
		 */
		public static function getContentTypeByExtension(extention:String=".*"):String {
			return contentTypes[extention] || "application/octet-stream";
		}
		//--------------------------------------
		//  EVENT HANDLERS
		//--------------------------------------
		
		//--------------------------------------
		//  PRIVATE & PROTECTED INSTANCE METHODS
		//--------------------------------------
		
		/**
		 * Add a boundary to the PostData with leading doubledash
		 */
		private function BOUNDARY(p:ByteArray):ByteArray {
			var l:int = getBoundary().length;

			p = DOUBLEDASH(p);
			for (var i:int = 0; i < l; i++ ) {
				p.writeByte( _boundary.charCodeAt( i ) );
			}
			return p;
		}

		/**
		 * Add one linebreak
		 */
		private function LINEBREAK(p:ByteArray):ByteArray {
			p.writeShort(0x0d0a);
			return p;
		}

		/**
		 * Add quotation mark
		 */
		private function QUOTATIONMARK(p:ByteArray):ByteArray {
			p.writeByte(0x22);
			return p;
		}

		/**
		 * Add Double Dash
		 */
		private function DOUBLEDASH(p:ByteArray):ByteArray {
			p.writeShort(0x2d2d);
			return p;
		}
		
		
	}
}


使用比较简单,如果不熟悉后台技术,测试比较麻烦。

如果没有测试地址的话,可以随便写一个地址,在服务器环境下打开swf,点击flash中的按钮发送请求,然后从浏览器的“开发者工具”里边“网络”选项中查看发送的请求。

发送的请求如下图:

可自行下载附件测试。


参考:

HTTP协议之multipart/form-data请求分析


源码打包下载

« 上一篇下一篇 »

相关文章:

闪电效果  (2017-11-28 15:4:19)

线段与椭圆的交点  (2017-1-6 14:43:41)

as3录制swf并保存flv视频  (2016-12-28 8:43:41)

解九连环  (2016-12-1 20:58:11)

as3实现setTimeout和trace  (2016-11-10 16:47:37)

registerCursor注册系统光标  (2016-9-14 9:49:40)

鼠标光标管理  (2016-9-13 17:44:3)

变形框(transform)实现  (2016-9-13 16:56:6)

flash文本消除锯齿不显示  (2016-8-25 11:43:31)

greenSock的easing曲线  (2016-8-24 18:30:11)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。